B
    0\El              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mZmZm	Z	 ddl
mZmZmZ ddlmZ ddlmZ d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 Zddddddd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 )    )print_functionN   )Image	ImageFileTiffImagePlugin)i8o8i16be)presets)isStringTypez0.6c             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Skip4   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$t
|d }t |dt |df}W n tk
r   Y n(X |dkr|| jd< || jd< || jd< n,|dkr|d d dkrd| jkr|| jd< n|dkrD|d d dkrD|| jd< n|dkrn|d d dkrn| j| n|dkr|d d dkrt |d| jd< yt
|d }W n tk
r   Y nX || jd< nF|dkr|d d dkr|dd  | jd< | j | d | jd < d| jkrd| jkryl|  }	|	d! }
|	d" }y|d# |d  }W n tk
rt   |}Y nX |
d$kr|d%9 }||f| jd< W n& tttfk
r   d&| jd< Y nX d S )'Nr   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   AdobeZadobeadobe_transforms   MPF mpZmpoffseti(  i  r      gRQ@)H   r&   )r   r   r   r   r   appapplistappendinfodivmodr   	Exceptionicclisttell_getexif	TypeErrorKeyErrorSyntaxErrorZeroDivisionError)r   r   r   sr'   versionr   r    r#   r!   Zresolution_unitZx_resolutionr   r   r   r   APP9   s`    




r6   c             C   s@   t | jdd }t| j|}|| jd< | jd|f d S )Nr   COM)r   r   r   r   r   r'   r(   r)   )r   r   r   r4   r   r   r   r7      s    
r7   c       	   	   C   s  t | jdd }t| j|}t |dd  t |dd  f| _t|d | _| jdkrjtd| j t|d | _	| j	dkrd| _
n2| j	dkrd	| _
n | j	d
krd| _
ntd| j	 |dkrd | jd< | jd< | jrP| j  t| jd d t| jkr<g }x"| jD ]}||dd   qW d|}nd }|| jd< d | _xbtdt|dD ]N}|||d  }| j|d t|d d t|d d@ t|d f qbW d S )Nr   r%   r   r   r   zcannot handle %d-bit layersr   LRGBr   CMYKzcannot handle %d-layer images)i  i  i  i  progressiveprogression          icc_profile      r   )r   r   r   r   r   _sizer   bitsr2   layersmoder*   r-   sortlenr)   joinrangelayer)	r   r   r   r4   Zprofilepr@   itr   r   r   SOF   s:    "





rO   c             C   s   t | jdd }t| j|}xht|rt|dk r@tdt|d }|d dkrtd|dd | j	|d@ < |dd  }q$d S q$W d S )	Nr   A   zbad quantization table markerr   rB   Br   r   )
r   r   r   r   r   rH   r2   r   arrayquantization)r   r   r   r4   vr   r   r   DQT   s    	
rU   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 0Z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   r      r   )prefixr   r   r   _accept%  s    rY   c               @   sD   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S )JpegImageFileJPEGzJPEG (ISO 10918)c             C   s@  | j d}t|dkr tdd | _| _g | _i | _i | _i | _	i | _
g | _g | _xt|}|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 filer   i  r:   zCMYK;Ijpeg)r   r    i  rW   i   zno marker found)r   r   r   r2   rD   rE   rK   Z
huffman_dcZ
huffman_acrS   r'   r(   r-   r   MARKERrF   sizetile)r   r4   rM   nameZdescriptionZhandlerrawmoder   r   r   _open1  sF    



zJpegImageFile._openc             C   s   | j |}|stjrdS |S )z
        internal: read more image data
        For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker
        so libjpeg can finish decoding
        s   )r   r   r   ZLOAD_TRUNCATED_IMAGES)r   Z
read_bytesr4   r   r   r   	load_readd  s    
zJpegImageFile.load_readc       	      C   s<  t | jdkrd S | jrd S | jd \}}}}d}|d dkrT|dkrT|| _|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| _| S )	Nr   r   r9   )r8   YCbCrr^   )r   r   r   r   r   r%   )rH   ra   ZdecoderconfigrF   minr`   rC   )	r   rF   r`   deoaZscaler4   r   r   r   drafts  s(    &
T.
zJpegImageFile.draftc             C   s   dd l }dd l}dd l}| \}}|| |j| jrR|dd|| jg nt	dzt
|}|  |j| _W d y|| W n tk
r   Y nX X | jj| _| jj| _g | _d S )Nr   Zdjpegz-outfilezInvalid Filename)
subprocesstempfileosZmkstempclosepathexistsfilename
check_call
ValueErrorr   openloadimunlinkOSErrorrF   r`   rC   ra   )r   rm   rn   ro   frq   Z_imr   r   r   
load_djpeg  s&    



zJpegImageFile.load_djpegc             C   s   t | S )N)r/   )r   r   r   r   r/     s    zJpegImageFile._getexifc             C   s   t | S )N)_getmp)r   r   r   r   r}     s    zJpegImageFile._getmpN)__name__
__module____qualname__formatZformat_descriptionrd   re   rl   r|   r/   r}   r   r   r   r   rZ   ,  s   3rZ   c                s   dd   fdd|   D S )Nc             S   s<   y"t | dkr t| ts | d S W n tk
r6   Y nX | S )Nr   r   )rH   
isinstancedictr,   )valuer   r   r   _fixup  s    z_fixup_dict.<locals>._fixupc                s   i | ]\}} ||qS r   r   ).0krT   )r   r   r   
<dictcomp>  s    z_fixup_dict.<locals>.<dictcomp>)items)Zsrc_dictr   )r   r   _fixup_dict  s    r   c          	   C   s   y| j d }W n tk
r"   d S X t|dd  }|d}t|}|| tt	|}y|
|d  W n ttfk
r   Y n$X t|}|| |t	| y|
|d  W n ttfk
r   Y n"X t|}|| t	||d< |S )Nr!   rA   r   ii  i%  )r*   r1   ioBytesIOr   r   ZImageFileDirectory_v1rw   r   r   seekr0   update)r   datafileheadr*   r!   r   r   r   r/     s0    






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|}|| t|}W n t	k
r   t
dY nX y|d }W n tk
r   t
d	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rpd|d< nt
dddddd d!d"d#}||d$ d%|d$< ||d< || qW ||d
< W n tk
r   t
d&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{}LLLHHrB   )	AttributeZSizeZ
DataOffsetZEntryNo1ZEntryNo2r   l        i   @i    i      i      i )ZDependentParentImageFlagZDependentChildImageFlagZRepresentativeImageFlagZReservedImageDataFormatMPTyper   r[   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*   r1   r   r   r   r   ZImageFileDirectory_v2rw   r   r,   r2   rJ   structZunpack_fromr   zipboolgetr)   )r   r   Zfile_contentsr   Z
endiannessr*   r$   ZquantZ	mpentriesZrawmpentriesZentrynumZunpackedentrylabelsZmpentryZmpentryattrZ	mptypemapr   r   r   r}     sh    






r}   r8   r9   zCMYK;Irf   )1r8   r9   ZRGBXr:   rf   )@r   r   r   rA   r>   r   r      r   r   r   r=   rB         *   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                sJ    fddt t D  x*t D ]\}fddtD  |< q$W  S )Nc                s   g | ]}| kr | qS r   r   )r   key)qtablesr   r   
<listcomp>U  s    z(convert_dict_qtables.<locals>.<listcomp>c                s   g | ]} | qS r   r   )r   rM   )tabler   r   r   W  s    )rJ   rH   	enumeratezigzag_index)r   idxr   )r   r   r   convert_dict_qtablesT  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 )NrE   )r   r   r   r   r%   r   )hasattrrE   rK   	samplingsr   )rx   Zsamplingr   r   r   get_sampling[  s    6r   c             C   sr  yt | j }W n" tk
r0   td| j Y nX | j}dd |ddD }|dd}|dd	}|d
}|dkrd}d}d}nv|tkrt| }	d}|	dd	}|	d}nJt|tst	dn6|tkrt| dd	}t
|r|tkrt| d}|dkrd}nV|dkrd}nF|dkr,d}n6|dkr<d}n&|dkrb| jdkrZt	dt| }dd }
|dkr| jdkrt	dt| dd }|
|}d}|d}|rLd}d}|| }g }x*|r||d |  ||d  }qW d}xV|D ]N}tdd| t| }|d| d t| tt| | 7 }|d7 }qW |dd pd|d!d }|d"d }|||d#d||d$d|d |d ||||d%df| _d}|s|r&| jd&krd'| jd  | jd  }nB|d(ks|dkrd| jd  | jd  }n| jd | jd  }ttj|t|d%dd) t|d }t| |d*d| j d|fg| d S )+Nzcannot write mode %s as JPEGc             S   s   g | ]}t t|qS r   )intround)r   xr   r   r   r   r  s    z_save.<locals>.<listcomp>r   )r   r   qualityr   subsamplingr   r   ZkeeprS   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 JPEGc          	      s*  | d kr| S t | rfydd |  D  W n tk
rF   tdY n X  fddtdt dD } t| tttfr&t| trt	| } nt| trt| } dt|   k rdk sn tdx`t
| D ]T\}}y t|dkrttd	|}W n tk
r   tdY qX t|| |< qW | S d S )
Nc             S   s.   g | ]&}| d dd   D ]}t|qqS )#r   r   )splitr   )r   lineZnumr   r   r   r     s    z3_save.<locals>.validate_qtables.<locals>.<listcomp>zInvalid quantization tablec                s   g | ]} ||d   qS )@   r   )r   r4   )linesr   r   r     s    r   r   r   z$None or too many quantization tablesrQ   )r   
splitlinesru   rJ   rH   r   tuplelistr   r   r   r0   rR   )r   r   r   r   )r   r   validate_qtables  s0    


z_save.<locals>.validate_qtablesr?   r@   r>   i  z>Hs   s   ICC_PROFILE r;   Fr<   optimizeZsmoothZ
streamtyper!   r:   r   _   r   r]   )RAWMODErF   r1   IOErrorZencoderinfor   r
   r   r   ru   r   r   r   getattrr)   r   ZpackrH   r   Zencoderconfigr`   maxr   ZMAXBLOCK_save)rx   r   rs   rc   r*   r   r   r   r   Zpresetr   Zextrar@   ZICC_OVERHEAD_LENZMAX_BYTES_IN_MARKERZMAX_DATA_BYTES_IN_MARKERZmarkersrM   r   r`   r;   r   bufsizer   r   r   r   i  s    










&

r   c             C   sR   dd l }dd l}|  }|dd||g y|| W n tk
rL   Y nX d S )Nr   Zcjpegz-outfile)ro   rm   Z_dumprt   ry   rz   )rx   r   rs   ro   rm   rn   r   r   r   _save_cjpeg  s    r   c          	   C   sr   t | |}y.| }|d dkr6ddlm} || |}W n4 ttfk
rP   Y n tk
rl   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)	rZ   r}   ZMpoImagePluginr   r0   
IndexErrorr2   warningswarn)r   rs   rx   Zmpheaderr   r   r   r   jpeg_factory
  s    
r   z.jfifz.jpez.jpgz.jpegz
image/jpeg)NN),Z
__future__r   rR   r   r   r   r^   r   r   r   Z_binaryr   r   r	   r   ZJpegPresetsr
   Z_utilr   __version__r   r6   r7   rO   rU   r_   rY   rZ   r   r/   r}   r   r   r   r   r   r   r   r   Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>#   s   U
0 
-M	 
