a
    Ag8|                  A   @  s  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZmZmZ ddlmZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ erddlmZ ddddddZ ddddddZ!ddddddZ"ddddddZ#ddddddZ$dde#fdde#fdd e#fd!d"e#fd#d$e fd%d&e#fd'd(e#fd)d*e#fd+d,d-e#fd.d/e#fd0d1e#fd2d3e fd4d5e#fd6d7e#fd8d9e#fd:d;d<d=d>d?d@dAdBdCdDdEe fddFe$fdGdHe fdIdJe fdKdLe#fdMdNe fdOdPe!fdQdRe!fdSdTe!fdUdVe!fdWdXe!fdYdZe!fd[d\e!fd]d^e!fd_d`e!fdadbe!fdcdde!fdedfe!fdgdhe!fdidje!fdkdle!fdmdne!fdodpdqdrdsdtdudvdwdxdydzd{d|dd}e"fd~?Z%dddddZ&G dd dejZ'dddddZ(dddddZ)dddddddZ*dZ+d dddZ,dddddZ-dddddddZ.dddddddZ/dddddddZ0e1e'j2e0e& e3e'j2e. e4e'j2g d e5e'j2d dS )    )annotationsN)IOTYPE_CHECKINGAny   )Image	ImageFile)i16be)i32be)o8)o16be)	deprecate)presetsMpoImageFileJpegImageFileintNone)selfmarkerreturnc                 C  s&   t | jdd }t| j| d S )N   )i16fpreadr   
_safe_read)r   r   n r   R/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/PIL/JpegImagePlugin.pySkip>   s    r   c                 C  s  t | jdd }t| j|}d|d@  }|| j|< | j||f |dkr
|d d dkr
t |d | jd< }t	|d	| jd
< z |d }t |dt |df}W n t
y   Y nJ0 |dkr|| jd< n |dkrtdd |D | jd< || jd< || jd< n|dkrp|d d dkrpd| jv rN| jd  |dd  7  < n|| jd< | j | d | _nN|dkr|d d dkr|ddd | jd< n|dkr|d d dkr|| jd< n|dkr|d d d kr| j| n|d!kr|d d" d#krd"}| jd$i }	|||d  d%krz|d7 }t ||}
|d7 }|| }|d| 7 }||d@ 7 }t||}|d7 }||||  }|
d&krt|d'd( t |dt|dd( t |dd)|	|
< n||	|
< ||7 }||d@ 7 }W n tjy   Y qY n0 q*n|d*krx|d d d+krxt |d| jd,< z|d- }W n tyj   Y n0 || jd.< nF|dkr|d d d/kr|dd  | jd0< | j | d | jd1< d S )2Nr   APP        s   JFIF   Zjfif   Zjfif_version      
   r   dpic                 s  s   | ]}|d  V  qdS )RQ@Nr   ).0dr   r   r   	<genexpr>_       zAPP.<locals>.<genexpr>	jfif_unitjfif_density     s   Exif  exif      http://ns.adobe.com/xap/1.0/     xmp  s   FPXR Zflashpix      ICC_PROFILE      s   Photoshop 3.0 	photoshops   8BIMi  r   i   )ZXResolutionZDisplayedUnitsXZYResolutionZDisplayedUnitsY  s   Adobeadobe   adobe_transforms   MPF mpZmpoffset)r   r   r   r   r   appapplistappendinfodivmod	Exceptiontupletell_exif_offsetspliticclist
setdefaulti32structerror
IndexError)r   r   r   srC   versionr/   r0   offsetr=   codeZname_lensizedatarA   r   r   r   r    C   s    





r    c                 C  sJ   t | jdd }t| j|}|| jd< || jd< | jd|f d S )Nr   commentCOM)	r   r   r   r   r   rF   rC   rD   rE   )r   r   r   rS   r   r   r   rZ      s
    

rZ   c           	      C  s  t | jdd }t| j|}t |dt |df| _|d | _| jdkrbd| j d}t||d | _| jdkr~d	| _	n:| jdkrd
| _	n(| jdkrd| _	nd| j d}t||dv rd | j
d< | j
d< | jr0| j  | jd d t| jkrdd | jD }d|}nd }|| j
d< g | _tdt|dD ]B}|||d  }| j|d |d d |d d@ |d f q@d S )Nr      r   r   r'   zcannot handle z-bit layersr$   LRGBr#   CMYKz-layer images)        progressiveprogression   c                 S  s   g | ]}|d d qS )r<   Nr   )r+   pr   r   r   
<listcomp>   r.   zSOF.<locals>.<listcomp>r.   icc_profiler2      r!   )r   r   r   r   r   _sizebitsSyntaxErrorlayers_moderF   rM   sortlenjoinrangelayerrE   )	r   r   r   rS   msgZprofilerh   itr   r   r   SOF   s:    







rw   c                   s   t | jdd }t| j|}t|r|d }|d dkrBdnd}d|d  }t||k rjd}t|t|dkrzdnd|d|  tj	d	kr|dkr 
   fd
dtD | j|d@ < ||d  }q"d S )Nr   r   ri   r   @   zbad quantization table markerBHlittlec                   s   g | ]} | qS r   r   )r+   ru   rX   r   r   rg      r.   zDQT.<locals>.<listcomp>r!   )r   r   r   r   r   rp   rl   arraysys	byteorderbyteswapzigzag_indexquantization)r   r   r   rS   vZ	precisionZ	qt_lengthrt   r   r|   r   DQT   s     r   ZSOF0zBaseline DCTZSOF1zExtended Sequential DCTZSOF2zProgressive DCTZSOF3zSpatial losslessZDHTzDefine Huffman tableZSOF5zDifferential sequential DCTZSOF6zDifferential progressive DCTZSOF7zDifferential spatial)ZJPG	ExtensionNZSOF9zExtended sequential DCT (AC)ZSOF10zProgressive DCT (AC)ZSOF11zSpatial lossless DCT (AC)ZDACz%Define arithmetic coding conditioningZSOF13z Differential sequential DCT (AC)ZSOF14z!Differential progressive DCT (AC)ZSOF15zDifferential spatial (AC))ZRST0z	Restart 0N)ZRST1z	Restart 1N)ZRST2z	Restart 2N)ZRST3z	Restart 3N)ZRST4z	Restart 4N)ZRST5z	Restart 5N)ZRST6z	Restart 6N)ZRST7z	Restart 7N)ZSOIzStart of imageN)ZEOIzEnd of imageNZSOSzStart of scanzDefine quantization tableZDNLzDefine number of linesZDRIzDefine restart intervalZDHPzDefine hierarchical progressionZEXPzExpand reference componentZAPP0zApplication segment 0APP1zApplication segment 1ZAPP2zApplication segment 2ZAPP3zApplication segment 3ZAPP4zApplication segment 4ZAPP5zApplication segment 5ZAPP6zApplication segment 6ZAPP7zApplication segment 7ZAPP8zApplication segment 8ZAPP9zApplication segment 9ZAPP10zApplication segment 10ZAPP11zApplication segment 11ZAPP12zApplication segment 12ZAPP13zApplication segment 13ZAPP14zApplication segment 14ZAPP15zApplication segment 15)ZJPG0zExtension 0N)ZJPG1zExtension 1N)ZJPG2zExtension 2N)ZJPG3zExtension 3N)ZJPG4zExtension 4N)ZJPG5zExtension 5N)ZJPG6zExtension 6N)ZJPG7zExtension 7N)ZJPG8zExtension 8N)ZJPG9zExtension 9N)ZJPG10zExtension 10N)ZJPG11zExtension 11N)ZJPG12zExtension 12N)ZJPG13zExtension 13NComment)?i  i  r_   i  i  i  r`   i  i  i  ra   i  i  i  rb   i  i  i  i  i  i  i  i  i  i  i    i  i  i  i  i  r"   r1   r8   i  i  i  i  i  i  i  i  i  i  r;   r>   i  i  i  i  i  i  i  i  i  i  i  i  i  i    i  bytesbool)prefixr   c                 C  s   | d d dkS )Nr[   s   r   )r   r   r   r   _acceptF  s    r   c                      s   e Zd ZdZdZddddZddd	d
dZdd fddZddd fddZdddddZ	ddddddZ
ddddZddd d!Zddd"d#Zddd$d%Z  ZS )&r   JPEGzJPEG (ISO 10918)r   )r   c                 C  sR  | j d}t|s d}t|d}d | _| _d| _g | _i | _i | _	i | _
i | _g | _g | _|d }|dkr|| j d }t|}n| j d}q`|tv rt| \}}}|d ur|| | |dkr| j}| jdkrd	}td
d| j d|dfg| _qF| j d}q`|dv r d}q`|dkr8| j d}q`d}t|q`|   d S )Nr[   znot a JPEG file   r      r   r   r^   CMYK;Ijpegr   r    >   r   i  i   zno marker found)r   r   r   rl   rk   rm   rK   rs   Z_huffman_dcZ_huffman_acr   rC   rD   rM   r   MARKERmoder   _TilerW   tile_read_dpi_from_exif)r   rS   rt   ru   namedescriptionhandlerrawmoder   r   r   _openS  sN    







zJpegImageFile._openstrr   )r   r   c                 C  s,   |dv r t |d t| d| S t|d S )N)Z
huffman_acZ
huffman_dcr9   _)r   getattrAttributeError)r   r   r   r   r   __getattr__  s    
zJpegImageFile.__getattr__z	list[Any]c                   s   t   | j| jg S N)super__getstate__rm   rs   r   	__class__r   r   r     s    zJpegImageFile.__getstate__)stater   c                   s$   t  | |dd  \| _| _d S )Nr$   )r   __setstate__rm   rs   )r   r   r   r   r   r     s    zJpegImageFile.__setstate__r   r   )
read_bytesr   c                 C  s.   | j |}|s*tjr*t| ds*d| _dS |S )z
        internal: read more image data
        For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker
        so libjpeg can finish decoding
        _endedTs   )r   r   r   ZLOAD_TRUNCATED_IMAGEShasattrr   )r   r   rS   r   r   r   	load_read  s
    zJpegImageFile.load_readz
str | Noneztuple[int, int] | Nonez0tuple[str, tuple[int, int, float, float]] | None)r   rW   r   c                 C  s  t | jdkrd S | jrd S | jd \}}}}d}| j}t|tsFJ |d dkrh|dv rh|| _|df}|r<t| jd |d  | jd |d  }dD ]}	||	kr qq|d usJ |d |d |d |d  |	 d |	 |d  |d |d  |	 d |	 |d  f}| jd |	 d |	 | jd |	 d |	 f| _|	}t	
||||g| _|df| _dd|d | |d | f}
| j|
fS )	Nr   r   r]   )r\   YCbCrr   )r'   r#   r   r   r   r[   )rp   r   ZdecoderconfigrW   
isinstancerI   rn   minrj   r   r   r   )r   r   rW   r,   eoaZscaleZoriginal_sizerS   Zboxr   r   r   draft  s8    &"".
zJpegImageFile.draftc                 C  s  t  \}}t| tj| jr:tdd|| jg n.zt	| W n t
yZ   Y n0 d}t|z`t| }|  |j| _W d    n1 s0    Y  W zt	| W q t
y   Y q0 n$zt	| W n t
y   Y n0 0 | jj| _| jj| _g | _d S )NZdjpeg-outfilezInvalid Filename)tempfilemkstemposclosepathexistsfilename
subprocess
check_callunlinkOSError
ValueErrorr   openloadimr   rn   rW   rj   r   )r   fr   rt   Z_imr   r   r   
load_djpeg  s2    
(

zJpegImageFile.load_djpegdict[int, Any] | Nonec                 C  s   t | S r   )_getexifr   r   r   r   r     s    zJpegImageFile._getexifc                 C  s   d| j v sd| j vrd S z|  }|d }|d }zt|d |d  }W n ty`   |}Y n0 t|rxd}t||dkr|d	9 }||f| j d< W n* tjt	t
tttfy   d
| j d< Y n0 d S )Nr)   r3   i(  i  r   r   zDPI is not a numberr[   r*   )H   r   )rF   getexiffloat	TypeErrormathisnanr   rP   rQ   KeyErrorrl   ZeroDivisionError)r   r3   Zresolution_unitZx_resolutionr)   rt   r   r   r   r     s2    


z!JpegImageFile._read_dpi_from_exifc                 C  s   t | S r   )_getmpr   r   r   r   r     s    zJpegImageFile._getmp)__name__
__module____qualname__formatformat_descriptionr   r   r   r   r   r   r   r   r   r   __classcell__r   r   r   r   r   O  s   8(r   )r   r   c                 C  s   d| j vrd S |   S )Nr3   )rF   r   Z_get_merged_dictr   r   r   r   r     s    
r   c              
   C  s@  z| j d }W n ty"   Y d S 0 t|}|d}|d d dkrLdnd}ddlm} z,||}||j	 |
| t|}W n2 ty } zd	}	t|	|W Y d }~n
d }~0 0 z|d
 }
W n2 ty } zd}	t|	|W Y d }~n
d }~0 0 g }z|d }td|
D ]}t| d||d }d}tt||}t|d d@ t|d d@ t|d d@ |d d@ d? |d d@ d? |d d@ d}|d dkrd|d< nd}	t|	ddd d!d"d#d$d%}||d& d'|d&< ||d< || q||d< W n4 ty: } zd(}	t|	|W Y d }~n
d }~0 0 |S ))NrB   r'   r#   s   MM *><r   )TiffImagePluginz)malformed MP Index (unreadable directory)  z(malformed MP Index (no number of images)i  r   ZLLLHHri   )	AttributeSizeZ
DataOffsetZEntryNo1ZEntryNo2r   l        i   @i    i      i      i )ZDependentParentImageFlagZDependentChildImageFlagZRepresentativeImageFlagZReservedImageDataFormatMPTyper   r   z!unsupported picture format in MPO	Undefinedz Large Thumbnail (VGA Equivalent)z$Large Thumbnail (Full HD Equivalent)zMulti-Frame Image (Panorama)zMulti-Frame Image: (Disparity)z Multi-Frame Image: (Multi-Angle)zBaseline MP Primary Image)r   i  i  i  i  i  i   r   Unknownz!malformed MP Index (bad MP Entry))rF   r   ioBytesIOr   r   r   ZImageFileDirectory_v2seeknextr   dictrH   rl   rr   rP   unpack_fromzipr   getrE   )r   rX   file_contentsheadZ
endiannessr   rF   rB   r   rt   ZquantZ	mpentriesZrawmpentriesZentrynumZunpackedentrylabelsZmpentryZmpentryattrZ	mptypemapr   r   r   r     sr    



  

	 r   r\   r]   r   r   )1r\   r]   ZRGBXr^   r   )@r   r   r$   r2   r<   r!   r      r   r#   r&   re   ri      r4   *   r[   r'   r9            )   +   	   r@      r      (   ,   5   r(             '   -   4   6         !   &   .   3   7   <      "   %   /   2   8   ;   =   #   $   0   1   9   :   >   ?   r   ))r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   zImage.Image)r   r   c                 C  sZ   t | tr| jdv rdS | jd dd | jd dd  | jd dd  }t|dS )N)r   r#   r   r   r[   r   )r   r   rm   rs   	samplingsr   )r   Zsamplingr   r   r   get_sampling  s    6r!  z	IO[bytes]zstr | bytes)r   r   r   r   c                 C  s  | j dks| jdkr d}t|zt| j }W n< tyj } z$d| j d}t||W Y d }~n
d }~0 0 | j}dd |ddD }|d	d
}|dd
}	|d}
|dkrd
}d}	d}
n|t	v rt	| }d
}|dd
}	|d}
nXt
|tsd}t|n>|	t	v r t	|	 dd
}	t
|
trD|
t	v rDt	|
 d}
|	dkrTd}	nZ|	dkrdd}	nJ|	dkrtd}	n:|	dkrd}	n*|	dkr| jdkrd}t|t| }	ddddd}|
dkr| jdkrd}t|t| dd }
||
}
|dd}d}|d }|rbd!}|| }t||kr:d"}t|td| t| }|d#| d$ | 7 }|d%}|rd&}|| }g }|r||d |  ||d  }qd}|D ]J}td| t| }|d'| d( t| tt| | 7 }|d7 }q|d)| jd)}|d*d+p*|d,d+}|d-d+}|d.d}t
|tjrZ| }t||krtd/}t||||d0d||d1d+|d2d|d |d |	|d3d|d4d|
|||f| _d}|s|rn| jd5krd6| jd  | jd  }nB|d7ks|d
kr,d| jd  | jd  }n| jd | jd  }|rV|t|d8 7 }|r|t|d 7 }nt|t|d8 t|d }t| |td9d| j d|g| d S ):Nr   z cannot write empty image as JPEGzcannot write mode z as JPEGc                 S  s   g | ]}t |qS r   )round)r+   xr   r   r   rg     r.   z_save.<locals>.<listcomp>r)   r   qualityr  subsamplingqtablesZkeepr   zInvalid quality settingz4:4:4z4:2:2r   z4:2:0r   z4:1:1r   z3Cannot use 'keep' when original image is not a JPEGzKstr | tuple[list[int], ...] | list[list[int]] | dict[int, list[int]] | Nonezlist[list[int]] | None)r&  r   c                   st  d u rS t tr~zdd  D  W n2 ty^ } zd}t||W Y d }~n(d }~0 0  fddtdt dD t tttfrpt trfddttD nt trtdt  k rdk sn d	}t|t	D ]t\}}z*t|dkrd}t
|td
|}W n4 t
y\ } zd}t||W Y d }~qd }~0 0 t||< qS d S )Nc                 S  s.   g | ]&}| d dd   D ]}t|qqS )#r   r   )rL   r   )r+   linenumr   r   r   rg     s   z3_save.<locals>.validate_qtables.<locals>.<listcomp>zInvalid quantization tablec                   s   g | ]} ||d   qS )rx   r   )r+   rS   )linesr   r   rg     r.   r   rx   c                   s   g | ]}| v r | qS r   r   )r+   key)r&  r   r   rg     s   r$   z$None or too many quantization tablesrz   )r   r   
splitlinesr   rr   rp   rI   listr   	enumerater   r}   )r&  r   rt   idxtableZtable_arrayr   )r*  r&  r   validate_qtables  s@    

 



 z_save.<locals>.validate_qtablesextrar.   r   r7   r4   zXMP data is too longs   r5   rh   r<   s   r:   rY   rc   Frd   optimizer3   zEXIF data is too longZsmoothZkeep_rgbZ
streamtypeZrestart_marker_blocksZrestart_marker_rowsr^   r#   _   r$   r   )widthheightr   RAWMODEr   r   r   Zencoderinfor   r   r   r   r   r   r!  r   rp   o16rE   r   rF   r   ZExiftobytesZencoderconfigrW   maxr   _saver   )r   r   r   rt   r   r   rF   r)   r$  r%  r&  presetr1  r2  ZMAX_BYTES_IN_MARKERr7   Zoverhead_lenZmax_data_bytes_in_markerrW   rh   markersru   r   rY   rc   r3  r3   bufsizer   r   r   r;    s     







*








r;  c                 C  s@   |   }tdd||g zt| W n ty:   Y n0 d S )NZcjpegr   )_dumpr   r   r   r   r   )r   r   r   r   r   r   r   _save_cjpegZ  s    r@  zstr | bytes | NonezJpegImageFile | MpoImageFile)r   r   r   c              	   C  s   t | |}zb| }|d urj|d dkrj|jD ]"\}}|dkr.d|v r.|  W S q.ddlm} |||}W n0 ttfy   Y n ty   t	
d Y n0 |S )Nr   r   r   s    hdrgm:Version="r   zTImage appears to be a malformed MPO file, it will be interpreted as a base JPEG file)r   r   rD   MpoImagePluginr   Zadoptr   rR   rl   warningswarn)r   r   r   Zmpheadersegmentcontentr   r   r   r   jpeg_factoryf  s     

rF  )z.jfifz.jpez.jpgz.jpegz
image/jpeg)N)6
__future__r   r}   r   r   r   rP   r   r~   r   rB  typingr   r   r   r   r   r   _binaryr	   r   r
   rO   r   r   r8  Z
_deprecater   ZJpegPresetsr   rA  r   r   r    rZ   rw   r   r   r   r   r   r   r7  r   r   r!  r;  r@  rF  Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>"   s   j0C	 EP
 H 