B
    zbGo              A   @   s  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 ddlmZ ddlmZ ddlmZ ddlmZ d	d
 Zdd Zdd Zdd Z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d(d)efd*d+efd,d-efd.d/efd0d1efd2d3d4d5d6d7d8d9d:d;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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dgdhdidjdkdldmdndodpdqdrdsdtdduefdv?Zdwdx ZG dydz dzejZd{d| Zd}d~ Z dddddddZ!dZ"d dddZ#dd Z$dd Z%dd Z&dd Z'dddZ(e
)ej*e(e e
+ej*e& e
,ej*ddddg e
-ej*d dS )    N   )Image	ImageFileTiffImagePlugin)i16be)i32be)o8)	deprecate)presetsc             C   s&   t | jdd }t| j| d S )N   )i16fpreadr   
_safe_read)selfmarkern r   2lib/python3.7/site-packages/PIL/JpegImagePlugin.pySkip7   s    r   c             C   s  t | jdd }t| j|}d|d@  }|| j|< | j||f |dkr|d d dkrt |d | jd< }t	|d	| jd
< y |d }t |dt |df}W n t
k
r   Y n(X |dkr|| jd< || jd< || jd< nL|dkr|d d dkrd| jkr0|| jd< n|dkrD|d d dkrD|| jd< n|dkrp|d d dkrp| j| n|dkr|d d dkrd}| jdi }	x|||d  dkry|d7 }t ||}
|d7 }|| }|d| 7 }||d@ 7 }t||}|d7 }||||  }|
dkrLt|d d! t |dt|dd! t |dd"}||	|
< ||7 }||d@ 7 }W n tjk
r   P Y nX qW n|d#kr|d d d$krt |d| jd%< y|d& }W n tk
r   Y nX || jd'< nF|dkr0|d d d(kr0|dd  | jd)< | j | d | jd*< d| jkrd| jkry|  }|d+ }|d, }yt|d  |d  }W n tk
r   |}Y nX t|rt|d-kr|d.9 }||f| jd< W n* tttttfk
r   d/| jd< Y nX d S )0Nr   zAPP%d   i     s   JFIF   Zjfif   Zjfif_version      
   r   dpi	jfif_unitjfif_densityi  s   Exif exifi  s   FPXR Zflashpix   s   ICC_PROFILE i     s   Photoshop 3.0 	photoshops   8BIMi  r   i   )ZXResolutionZDisplayedUnitsXZYResolutionZDisplayedUnitsYi  s   AdobeZadobe   adobe_transforms   MPF mpZmpoffseti(  i     gRQ@)H   r(   )r   r   r   r   r   appapplistappendinfodivmod	Exceptionicclist
setdefaulti32structerror
IndexErrortellgetexiffloat	TypeErrormathZisnan
ValueErrorKeyErrorSyntaxErrorZeroDivisionError)r   r   r   sr)   versionr   r   offsetr#   codeZname_lensizedatar%   r    Zresolution_unitZx_resolutionr   r   r   r   APP<   s    







rD   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   r,   r)   r*   r+   )r   r   r   r>   r   r   r   rF      s
    

rF   c       	      C   s  t | jdd }t| j|}t |dt |df| _|d | _| jdkr^td| j d|d | _| jdkrzd	| _	n6| jdkrd
| _	n$| jdkrd| _	ntd| j d|dkrd | j
d< | j
d< | jr@| j  | jd d t| jkr,g }x"| jD ]}||dd   qW d|}nd }|| j
d< g | _xVtdt|dD ]B}|||d  }| j|d |d d |d d@ |d f qRW d S )Nr   r'   r   r   r   zcannot handle z-bit layersr   LRGBr   CMYKz-layer images)i  i  i  i  progressiveprogression   r"       icc_profile      r   )r   r   r   r   r   _sizebitsr<   layersmoder,   r/   sortlenr+   joinrangelayer)	r   r   r   r>   ZprofileprN   itr   r   r   SOF   s:    







r]   c                s   t | jdd }t| j|}xt|r|d }|d dkrDdnd}d|d  }t||k rhtdt|dkrxdnd|d|  tj	d	kr|dkr 
   fd
dtD | j|d@ < ||d  }q$W d S )Nr   r   rP   r   @   zbad quantization table markerBHlittlec                s   g | ]} | qS r   r   ).0r[   )rC   r   r   
<listcomp>  s    zDQT.<locals>.<listcomp>r   )r   r   r   r   r   rV   r<   arraysys	byteorderZbyteswapzigzag_indexquantization)r   r   r   r>   vZ	precisionZ	qt_lengthr   )rC   r   DQT   s    
 rj   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JPGZ	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  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  c             C   s   | d d dkS )Nr'   s   r   )prefixr   r   r   _acceptL  s    rn   c               @   sL   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd ZdS )JpegImageFileJPEGzJPEG (ISO 10918)c             C   s@  | j d}t|stdd}d | _| _g | _i | _i | _i | _	i | _
g | _g | _x|d }|dkr|| j d }t|}n| j d}qX|tkrt| \}}}|d k	r|| | |dkr| j}| jdkrd	}d
d| j d|dffg| _P | j d}qX|dks|dkrd}qX|dkr0| j d}qXtdqXW d S )Nr'   znot a JPEG file   r      r   i  rI   zCMYK;Ijpeg)r   r    i  i   zno marker found)r   r   rn   r<   rR   rS   rY   Z
huffman_dcZ
huffman_acrh   r)   r*   r/   r   MARKERrT   rB   tile)r   r>   r[   nameZdescriptionZhandlerrawmoder   r   r   _openZ  sF    



zJpegImageFile._openc             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hasattrrz   )r   Z
read_bytesr>   r   r   r   	load_read  s
    zJpegImageFile.load_readc             C   sd  t | jdkrd S | jrd S | jd \}}}}d}| j}|d dkrZ|dkrZ|| _|df}|r$t| jd |d  | jd |d  }xdD ]}	||	krP qW |d |d |d |d  |	 d |	 |d  |d |d  |	 d |	 |d  f}| jd |	 d |	 | jd |	 d |	 f| _|	}||||fg| _|df| _dd|d | |d | f}
| j|
fS )	Nr   r   rH   )rG   YCbCrrt   )r   r   r   r   r   r'   )rV   rv   ZdecoderconfigrB   rT   minrQ   )r   rT   rB   deoaZscaleZoriginal_sizer>   Zboxr   r   r   draft  s2    &
"&.
zJpegImageFile.draftc             C   s   t  \}}t| tj| jr:tdd|| jg nt	dz*t
|}|  |j| _W d Q R X W d yt| W n tk
r   Y nX X | jj| _| jj| _g | _d S )NZdjpegz-outfilezInvalid Filename)tempfileZmkstemposclosepathexistsfilename
subprocess
check_callr:   r   openloadimunlinkOSErrorrT   rB   rQ   rv   )r   fr   Z_imr   r   r   
load_djpeg  s     


zJpegImageFile.load_djpegc             C   s   t | S )N)_getexif)r   r   r   r   r     s    zJpegImageFile._getexifc             C   s   t | S )N)_getmp)r   r   r   r   r     s    zJpegImageFile._getmpc             C   sB   x<| j D ]2\}}|dkr|dd\}}|dkr| |S qW i S )z
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        rk       r   s   http://ns.adobe.com/xap/1.0/)r*   rsplitZ_getxmp)r   ZsegmentZcontentr   Zxmp_tagsr   r   r   getxmp  s    zJpegImageFile.getxmpN)__name__
__module____qualname__formatZformat_descriptionry   r|   r   r   r   r   r   r   r   r   r   ro   U  s   3%ro   c             C   s   d| j krd S |   S )Nr    )r,   r6   Z_get_merged_dict)r   r   r   r   r     s    
r   c          
   C   s"  y| j d }W n tk
r"   d S X t|}|d}|d d dkrLdnd}y,t|}||j |	| t
|}W n, tk
r } ztd|W d d }~X Y nX y|d }W n, tk
r } ztd	|W d d }~X Y nX g }	y|d
 }
xt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tdddddd d!d"d#}||d$ d%|d$< ||d< |	| q W |	|d
< W n. tk
r } ztd&|W d d }~X Y nX |S )'Nr&   r   r   s   MM *><z)malformed MP Index (unreadable directory)i  z(malformed MP Index (no number of images)i  r   ZLLLHHrP   )	AttributeZSizeZ
DataOffsetZEntryNo1ZEntryNo2r   l        i   @i    i      i      i )ZDependentParentImageFlagZDependentChildImageFlagZRepresentativeImageFlagZReservedImageDataFormatMPTyper   rp   z!unsupported picture format in MPOZ	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   ZUnknownz!malformed MP Index (bad MP Entry))r,   r;   ioBytesIOr   r   ZImageFileDirectory_v2seeknextr   dictr.   r<   rX   r2   Zunpack_fromzipboolgetr+   )r   rC   Zfile_contentsheadZ
endiannessr,   r&   r   ZquantZ	mpentriesZrawmpentriesZentrynumZunpackedentrylabelsZmpentryZmpentryattrZ	mptypemapr   r   r   r     sb    




r   rG   rH   zCMYK;Ir}   )1rG   rH   ZRGBXrI   r}   )@r   r   r   rO   r"   r   r      r   r   r   rL   rP         *   r'   r   r!            )   +   	   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   c             C   s   t dddd | S )Nconvert_dict_qtablesr   zConversion is no longer needed)action)r	   )qtablesr   r   r   r   ^  s    r   c             C   sZ   t | dr| jdkrdS | jd dd | jd dd  | jd dd  }t|dS )NrS   )r   r   r   r   r'   r   )r{   rS   rY   	samplingsr   )r   Zsamplingr   r   r   get_samplingc  s    6r   c             C   s  | j dks| jdkrtdyt| j }W n6 tk
r` } ztd| j d|W d d }~X Y nX | j}dd |ddD }|d	d
}|dd
}|d}	|dkrd
}d}d}	n~|t	krt	| }
d
}|
dd
}|
d}	nRt
|tstdn>|t	krt	| dd
}t
|	tr4|	t	kr4t	|	 d}	|dkrDd}nV|dkrTd}nF|dkrdd}n6|dkrtd}n&|dkr| jdkrtdt| }dd }|	dkr| jdkrtdt| dd }	||	}	d}|d}|rd}d}|| }g }x*|r&||d |  ||d  }qW d}xV|D ]N}tdd| t| }|d| d  t| tt| | 7 }|d7 }q2W |d!d"p|d#d"}|d$d"}|d%d}t
|tjr| }|||d&d||d'd|d |d ||	||f| _d}|s|rx| jd(kr6d)| jd  | jd  }nB|d*ksJ|d
krdd| jd  | jd  }n| jd | jd  }ttj|t|d+ t|d }t| |d,d| j d|f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)rb   xr   r   r   rc   |  s    z_save.<locals>.<listcomp>r   )r   r   qualityr   subsamplingr   Zkeeprh   zInvalid quality settingz4:4:4z4:2:2r   z4:2:0r   z4:1:1rp   z3Cannot use 'keep' when original image is not a JPEGc                s`  d krS t trxydd  D  W n, tk
rX } ztd|W d d }~X Y n X  fddtdt dD t tttfr\t trfddttD nt trtdt  k rdk sn td	xrt	D ]f\}}y"t|dkr
t
td
|}W n. t
k
rF } ztd|W d d }~X Y qX t||< qW S d S )Nc             S   s.   g | ]&}| d dd   D ]}t|qqS )#r   r   )splitint)rb   lineZnumr   r   r   rc     s   z3_save.<locals>.validate_qtables.<locals>.<listcomp>zInvalid quantization tablec                s   g | ]} ||d   qS )r^   r   )rb   r>   )linesr   r   rc     s    r   r^   c                s   g | ]}| kr | qS r   r   )rb   key)r   r   r   rc     s    r   z$None or too many quantization tablesr`   )
isinstancestr
splitlinesr:   rX   rV   tuplelistr   	enumerater8   rd   )r   r   idxtabler   )r   r   r   validate_qtables  s2    


z_save.<locals>.validate_qtablesrM   rN   r"   i  z>Hs   s   ICC_PROFILE rJ   FrK   optimizer    ZsmoothZ
streamtyperI   r   _   r   rs   )widthZheightr:   RAWMODErT   r;   r   Zencoderinfor   r
   r   r   r   r   r   getattrr+   r2   ZpackrV   r   r   ZExiftobytesZencoderconfigrB   maxr   ZMAXBLOCK_save)r   r   r   rx   r   r,   r   r   r   r   Zpresetr   ZextrarN   ZICC_OVERHEAD_LENZMAX_BYTES_IN_MARKERZMAX_DATA_BYTES_IN_MARKERZmarkersr[   r   rB   rJ   r   r    bufsizer   r   r   r   q  s    &








"


&

 r   c             C   sB   |   }tdd||g yt| W n tk
r<   Y nX d S )NZcjpegz-outfile)Z_dumpr   r   r   r   r   )r   r   r   r   r   r   r   _save_cjpeg  s    r   c          	   C   st   t | |}y0| }|d dkr8ddlm} |||}W n4 ttfk
rR   Y n tk
rn   t	d Y nX |S )Ni  r   )MpoImageFilezTImage appears to be a malformed MPO file, it will be interpreted as a base JPEG file)
ro   r   ZMpoImagePluginr   Zadoptr8   r4   r<   warningswarn)r   r   r   Zmpheaderr   r   r   r   jpeg_factory  s    
r  z.jfifz.jpez.jpgz.jpegz
image/jpeg)NN).rd   r   r9   r   r2   r   re   r   r   rt   r   r   r   Z_binaryr   r   r   r1   r   Z
_deprecater	   ZJpegPresetsr
   r   rD   rF   r]   rj   ru   rn   ro   r   r   r   rg   r   r   r   r   r   r  Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>"   s   x0	 J "
