a :jgL@sddlmZddlZddlZddlZddlmZmZmZddl m Z m Z m Z m Z mZddlmZddd d d d d Zddd d d ddZGddde jZe ejee ejee ejde ejddS)) annotationsN)IOAnycast)Image ImageFile ImageSequenceJpegImagePluginTiffImagePlugin)o32lez Image.Imagez IO[bytes]z str | bytesNone)imfpfilenamereturncCst|||dSN)r _save)rrrrd}nd}| t d|| | dd7} | dkrl| |8} | | 7} q&| | d<|||dtd| d|dtjdS)N append_images is_animatedFsz>HXsMPFsR extraexifZJPEGs0100irizosz1MpoImageFile._after_jpeg_open..r rr?r)Z_getmpZmpinfo ValueErrorZn_frames_MpoImageFile__mpoffsetsr+r@rr_fpr0_MpoImageFile__frameoffsetreadonly)r=r>msgrr<rr;is"     zMpoImageFile._after_jpeg_openint)posrcCs|j|dSr)rEr0)r=rKrrr load_seekszMpoImageFile.load_seek)framercCs||sdS|j|_|j||_|jd}d|jvr@|jd=|j|jd|jdsjd}t ||j|jt j ||jd|kr| tdd|j|j|jddg|_||_dS)NrzNo data found for frameZjpeg)rrrr)Z _seek_checkrErrDrGr@r"r0readrCr r9r:Z _reload_exifrZ_Tiler6ZtilerF)r=rMZ original_exifrIrrrr0s$       zMpoImageFile.seekcCs|jSr)rFr<rrrr-szMpoImageFile.tellzJpegImagePlugin.JpegImageFile) jpeg_instancer>rcCst|_tt|}|||S)aC Transform the instance of JpegImageFile into an instance of MpoImageFile. After the call, the JpegImageFile is extended to be an MpoImageFile. This is essentially useful when opening a JPEG file that reveals itself as an MPO, to avoid double call to _open. )r8 __class__rr;)rPr>Z mpo_instancerrradopts  zMpoImageFile.adopt)N)N) __name__ __module__ __qualname__formatformat_descriptionZ!_close_exclusive_fp_after_loadingr:r;rLr0r- staticmethodrRrrrrr8_sr8z.mpoz image/mpo) __future__rr$r2r'typingrrrrrr r r _binaryr rr7r9r8Z register_saverVZregister_save_allZregister_extensionZ register_mimerrrrs  6Z