a :jgzA@sddlmZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z m Z mZddlmZmZddlmZddlmZddlmZdd lmZdd lmZdd lmZe rdd lmZd dddddZ d dddddZ!d dddddZ"d dddddZ#d dddddZ$dde#fdde#fdd e#fd!d"e#fd#d$e fd%d&e#fd'd(e#fd)d*e#fd+d,d-e#fd.d/e#fd0d1e#fd2d3e fd4d5e#fd6d7e#fd8d9e#fd:d;dd?d@dAdBdCdDdEe fddFe$fdGdHe fdIdJe fdKdLe#fdMdNe fdOdPe!fdQdRe!fdSdTe!fdUdVe!fdWdXe!fdYdZe!fd[d\e!fd]d^e!fd_d`e!fdadbe!fdcdde!fdedfe!fdgdhe!fdidje!fdkdle!fdmdne!fdodpdqdrdsdtdudvdwdxdydzd{d|dd}e"fd~?Z%dddddZ&Gdd d ejZ'd ddddZ(d ddddZ)dddddddZ*dZ+ddddZ,dddddZ-dddddddZ.dddddddZ/dddddddZ0e1e'j2e0e&e3e'j2e.e4e'j2gde5e'j2ddS)) annotationsN)IO TYPE_CHECKINGAny)Image ImageFile)i16be)i32be)o8)o16be) deprecate)presets MpoImageFile JpegImageFileintNone)selfmarkerreturncCs&t|jdd}t|j|dS)N)i16fpreadr _safe_read)rrnr=/usr/local/lib/python3.9/site-packages/PIL/JpegImagePlugin.pySkip>srcCst|jdd}t|j|}d|d@}||j|<|j||f|dkr|dddkrt|d|jd<}t |d |jd <z |d }t|d t|d f}Wnt yYn(0|dkr||jd<||jd<||jd<n|dkrH|dddkrHd|jvr&|jd|dd7<n||jd<|j |d|_ nN|dkr~|dddkr~| ddd|jd<n|dkr|dddkr||jd<n|dkr|dddkr|j|n|dkr|dd d!krd }|jd"i} |||dd#krz|d7}t||} |d7}||} |d| 7}||d@7}t||} |d7}|||| } | d$krt| d%d&t| dt| d d&t| dd'| | <n| | | <|| 7}||d@7}WntjyYqYn0qn|d(krP|ddd)krPt|d|jd*<z |d+}WntyBYn 0||jd,<nF|dkr|ddd-kr|dd|jd.<|j |d|jd/<dS)0NrzAPP%dsJFIFZjfifZ jfif_version rdpi jfif_unit jfif_densitysExifexifhttp://ns.adobe.com/xap/1.0/xmpsFPXRZflashpix ICC_PROFILEsPhotoshop 3.0 photoshops8BIMiri)Z XResolutionZDisplayedUnitsXZ YResolutionZDisplayedUnitsYsAdobeadobe adobe_transformsMPFmpZmpoffset)rrrrrappapplistappendinfodivmod Exceptiontell _exif_offsetspliticclist setdefaulti32structerror IndexError)rrrsr=versionr)r*offsetr7codeZname_lensizedatar;rrrAPPCs~                  rRcCsJt|jdd}t|j|}||jd<||jd<|jd|fdS)NrcommentCOM) rrrrrr@r=r>r?)rrrrLrrrrTs   rTc Cst|jdd}t|j|}t|dt|df|_|d|_|jdkrbd|jd}t||d|_|jdkr~d |_ n:|jdkrd |_ n(|jd krd |_ nd|jd }t||dvrd|j d<|j d<|j r0|j |j ddt |j krdd|j D}d|}nd}||j d<g|_ tdt |dD]B}|||d}|j|d|dd|dd@|dfq@dS)Nrrrr&zcannot handle z -bit layersr#LRGBr"CMYKz -layer images) progressive progression cSsg|]}|ddqS)r6Nr).0prrr zSOF..rc icc_profiler,r )rrrrr_sizebits SyntaxErrorlayers_moder@rFsortlenjoinrangelayerr?) rrrrLmsgZprofilerditrrrSOFs:         rscst|jdd}t|j|}t|r|d}|ddkrBdnd}d|d}t||krjd}t|t|dkrzdnd|d|tj d kr|dkr fd d t D|j |d @<||d}q"dS) Nrrrer@zbad quantization table markerBHlittlecsg|] }|qSrr)r`rqrQrrrbrczDQT..r ) rrrrrrlrharraysys byteorderbyteswap zigzag_index quantization)rrrrLv precisionZ qt_lengthrprrxrDQTs   rZSOF0z Baseline DCTZSOF1zExtended Sequential DCTZSOF2zProgressive DCTZSOF3zSpatial losslessZDHTzDefine Huffman tableZSOF5zDifferential sequential DCTZSOF6zDifferential progressive DCTZSOF7zDifferential spatial)ZJPG ExtensionNZSOF9zExtended sequential DCT (AC)ZSOF10zProgressive DCT (AC)ZSOF11zSpatial lossless DCT (AC)ZDACz%Define arithmetic coding conditioningZSOF13z Differential sequential DCT (AC)ZSOF14z!Differential progressive DCT (AC)ZSOF15zDifferential spatial (AC))ZRST0z Restart 0N)ZRST1z Restart 1N)ZRST2z Restart 2N)ZRST3z Restart 3N)ZRST4z Restart 4N)ZRST5z Restart 5N)ZRST6z Restart 6N)ZRST7z Restart 7N)ZSOIzStart of imageN)ZEOIz End of imageNZSOSz Start of scanzDefine quantization tableZDNLzDefine number of linesZDRIzDefine restart intervalZDHPzDefine hierarchical progressionZEXPzExpand reference componentZAPP0zApplication segment 0APP1zApplication segment 1ZAPP2zApplication segment 2ZAPP3zApplication segment 3ZAPP4zApplication segment 4ZAPP5zApplication segment 5ZAPP6zApplication segment 6ZAPP7zApplication segment 7ZAPP8zApplication segment 8ZAPP9zApplication segment 9ZAPP10zApplication segment 10ZAPP11zApplication segment 11ZAPP12zApplication segment 12ZAPP13zApplication segment 13ZAPP14zApplication segment 14ZAPP15zApplication segment 15)ZJPG0z Extension 0N)ZJPG1z Extension 1N)ZJPG2z Extension 2N)ZJPG3z Extension 3N)ZJPG4z Extension 4N)ZJPG5z Extension 5N)ZJPG6z Extension 6N)ZJPG7z Extension 7N)ZJPG8z Extension 8N)ZJPG9z Extension 9N)ZJPG10z Extension 10N)ZJPG11z Extension 11N)ZJPG12z Extension 12N)ZJPG13z Extension 13NComment)?iirYiiirZiiir[iiir\iiiiiiiiiiiiiiiir!r+r2iiiiiiiiiir5r8iiiiiiiiiiiiiiibytesbool)prefixrcCs|dddkS)NrUsr)rrrr_acceptCsrc@seZdZdZdZddddZddd d d Zd d dddZddddddZddddZ ddddZ ddddZ ddddZ d S)!rJPEGzJPEG (ISO 10918)r)rcCsR|jd}t|s d}t|d}d|_|_d|_g|_i|_i|_ i|_ i|_ g|_ g|_ |d}|dkr||jd}t|}n|jd}q`|tvrt|\}}}|dur||||dkr|j}|jdkrd }td d |jd|d fg|_qF|jd}q`|d vr d}q`|dkr8|jd}q`d}t|q`|dS)NrUznot a JPEG filerrrrXCMYK;Ijpegrr>riizno marker found)rrrrhrgrirDroZ _huffman_dcZ _huffman_acr~r=r>rFrMARKERmoder_TilerPtile_read_dpi_from_exif)rrLrprqname descriptionhandlerrawmoderrr_openPsN           zJpegImageFile._openstrr)rrcCs,|dvr t|dt|d|St|dS)N)Z huffman_acZ huffman_dcr3_)r getattrAttributeError)rrrrr __getattr__s zJpegImageFile.__getattr__rr) read_bytesrcCs.|j|}|s*tjr*t|ds*d|_dS|S)z internal: read more image data For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker so libjpeg can finish decoding _endedTs)rrrZLOAD_TRUNCATED_IMAGEShasattrr)rrrLrrr load_reads  zJpegImageFile.load_readz str | Noneztuple[int, int] | Nonez0tuple[str, tuple[int, int, float, float]] | None)rrPrc Cst|jdkrdS|jrdS|jd\}}}}d}|j}t|tsFJ|ddkrh|dvrh||_|df}|r?r))rrrrrr)rrrrrr)rrrrrrz Image.Image)rrcCsZt|tr|jdvrdS|jddd|jddd|jddd}t|dS)N)rr"rrrUr)rrriro samplingsr)rZsamplingrrr get_sampling{s6rz IO[bytes]z str | bytes)rrrrcCs|jdks|jdkr d}t|zt|j}Wn<tyj}z$d|jd}t||WYd}~n d}~00|j}dd|ddD}|d d }|d d } |d } |d krd }d } d } n|t vrt |} d }| d d } | d} nXt |t sd}t|n>| t vr t | d d } t | t rD| t vrDt | d} | dkrTd} nZ| dkrdd} nJ| dkrtd} n:| dkrd} n*| d kr|j dkrd}t|t|} ddddd} | d kr|j dkrd}t|t|dd} | | } |dd} d}|d |jd }|rld!}||}t||krDd"}t|td|t|}| d#|d$|7} |d%}|rd&}||}g}|r||d|||d}qd}|D]J}td|t|}| d'|d(t|tt||7} |d7}q|d)|jd)}|d*d+p4|d,d+}|d-d+}|d.d}t |tjrd|}t||kr~d/}t||||d0d||d1d+|d2d|d|d| |d3d|d4d| || |f|_d}|s|rx|jd5krd6|jd|jd}nB|d7ks|d kr6d|jd|jd}n|jd|jd}|r`|t|d87}| r|t| d7}nt|t|d8t| d}t||td9d|jd|g|dS):Nrz cannot write empty image as JPEGzcannot write mode z as JPEGcSsg|] }t|qSr)round)r`xrrrrbrcz_save..r(rqualityr subsamplingqtablesZkeepr~zInvalid quality settingz4:4:4z4:2:2rz4:2:0rz4:1:1rz3Cannot use 'keep' when original image is not a JPEGzKstr | tuple[list[int], ...] | list[list[int]] | dict[int, list[int]] | Nonezlist[list[int]] | None)r rc stdur Sttr~zddDWn2ty^}zd}t||WYd}~n(d}~00fddtdtdDttttfrpttrfddttDnttrtdtkrdksnd }t|t D]t\}}z*t|dkrd}t |t d |}Wn4t y\}zd}t||WYd}~qd}~00t||<qSdS) NcSs.g|]&}|dddD] }t|qqS)#rr)rEr)r`linenumrrrrbsz3_save..validate_qtables..zInvalid quantization tablecsg|]}||dqS)rtr)r`rL)linesrrrbrcrrtcsg|]}|vr|qSrr)r`key)r rrrbsr#z$None or too many quantization tablesrv) rr splitlinesrrnrlrlistr enumeraterry)r rrpidxtableZ table_arrayr)r$r rvalidate_qtabless@        z_save..validate_qtablesextrarcrr1r.zXMP data is too longsr/rdr6sr4rSr]Fr^optimizer-zEXIF data is too longZsmoothZkeep_rgbZ streamtypeZrestart_marker_blocksZrestart_marker_rowsrXr"_r#r)widthheightrRAWMODErrrZ encoderinforrrrrrrrr@rlo16r?r rZExiftobytesZ encoderconfigrPmaxr_saver)rrrrprrr@r(rrr presetr+r,ZMAX_BYTES_IN_MARKERr1Z overhead_lenZmax_data_bytes_in_markerrPrdmarkersrqrrSr]r-r-bufsizerrrr5s               *                r5cCs@|}tdd||gzt|Wnty:Yn0dS)NZcjpegr)_dumprrrrr)rrrrrrr _save_cjpegPs  r:zstr | bytes | NonezJpegImageFile | MpoImageFile)rrrc Cst||}zb|}|durj|ddkrj|jD]"\}}|dkr.d|vr.|WSq.ddlm}|||}Wn0ttfyYntyt dYn0|S)Nrrrs hdrgm:Version="rzTImage appears to be a malformed MPO file, it will be interpreted as a base JPEG file) rrr>MpoImagePluginrZadoptrrKrhwarningswarn)rrrZmpheadersegmentcontentrrrr jpeg_factory\s      r@)z.jfifz.jpez.jpgz.jpegz image/jpeg)N)6 __future__rryrrrrIrrzrr<typingrrrrrr_binaryr rr rHr r r2Z _deprecater Z JpegPresetsrr;rrrRrTrsrrrrrrr1r}rrr5r:r@Z register_openrZ register_saveZregister_extensionsZ register_mimerrrr"s        g 0C >P  H