
hR\<j              @   @   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 i? d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d  e f d! 6d" d# e f d$ 6d% d& e f d' 6d( d) e f d* 6d,d- 6d. d/ e f d0 6d1 d2 e f d3 6d4 d5 e f d6 6d7 d8 e f d9 6d: d; e f d< 6d= d> e f d? 6d@ dA e f dB 6d-dE 6d.dH 6d/dK 6d0dN 6d1dQ 6d2dT 6d3dW 6d4dZ 6d5d] 6d6d` 6da db e f dc 6d dd e f de 6df dg e f dh 6di dj e f dk 6dl dm e f dn 6do dp e f dq 6dr ds e f dt 6du dv e f dw 6dx dy e f dz 6d{ d| e f d} 6d~ d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d7d 6d8d 6d9d 6d:d 6d;d 6d<d 6d=d 6d>d 6d?d 6d@d 6dAd 6dBd 6dCd 6dDd 6d d e f d 6Z d d   Z Gd d   d e j  Z d d   Z d d   Z d d   Z i d d 6d d 6d d 6d d 6d d 6d d 6Z dEZ  i d  dF6d dG6d dH6Z! dd  Z" dd   Z# d!d"  Z$ d#d$  Z% d d d%d& Z& e j' e j( e& e  e j) e j( e$  e j* e j( d'd(d)d*g  e j+ e j( d+ d S(I      )print_functionN   )Image	ImageFileTiffImagePlugin)i8o8i16be)presets)isStringTypez0.6c             C   s3   t  |  j j d   d } t j |  j |  d  S)N   )i16fpreadr   
_safe_read)selfmarkern r   H/var/www/dbchiro/venv/lib/python3.4/site-packages/PIL/JpegImagePlugin.pySkip4   s    r   c             C   sU  t  |  j j d   d } t j |  j |  } d | d @} | |  j | <|  j j | | f  | d k r*| d  d  d k r*t  | d  |  j d <} t	 | d	  |  j d
 <y2 t
 | d  } t  | d  t  | d  f } Wn YqX| d k r| |  j d <n  | |  j d <| |  j d <nZ| d k r\| d  d  d k r\| |  j d <n(| d k r| d  d  d k r| |  j d <n | d k r| d  d  d k r|  j j |  n | d k r*| d  d  d k r*t  | d  |  j d <y t
 | d  } Wn YqX| |  j d <nZ | d k r| d  d  d k r| d d   |  j d <|  j j   | d |  j d  <n  d |  j k rQd |  j k rQy |  j   }	 |	 d! }
 |	 d" } y | d# | d } Wn t k
 r| } Yn X|
 d$ k r| d% 9} n  | | f |  j d <WqQt t t f k
 rMd' |  j d <YqQXn  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   Adobeadobeadobe_transforms   MPF mpZmpoffseti(  i  r      gRQ@H   )r'   r'   )r   r   r   r   r   appapplistappendinfodivmodr   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   sX   t  |  j j d   d } t j |  j |  } | |  j d <|  j 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   sU  t  |  j j d   d } t j |  j |  } t  | d d    t  | d d    f |  _ t | d  |  _ |  j d k r t d |  j   n  t | d  |  _	 |  j	 d k r d |  _
 nI |  j	 d k r d	 |  _
 n. |  j	 d
 k r d |  _
 n t d |  j	   | d k r6d |  j d <|  j d <n  |  j r|  j j   t |  j d d  t |  j  k rg  } x( |  j D] } | j | d d    qWd j |  } n d  } | |  j d <d  |  _ n  xz t d t |  d  D]` } | | | d  } |  j j | d t | d  d t | d  d @t | d  f  qWd  S)Nr   r&   r   r   r   zcannot handle %d-bit layersr   LRGBr   CMYKzcannot handle %d-layer images        progressiveprogression          icc_profile      r   )r;   r<   r=   r>   )r   r   r   r   r   sizer   bitsr2   layersmoder+   r-   sortlenr*   joinrangelayer)	r   r   r   r4   ZprofileprD   itr   r   r   SOF   s:    /	&rS   c             C   s   t  |  j j d   d } t j |  j |  } x t |  r t |  d k  ra t d   n  t | d  } | d d k r t j d | d d   |  j	 | d @<| d d   } q4 d  Sq4 Wd  S)	Nr   A   zbad quantization table markerr   rF   Br   r   )
r   r   r   r   r   rL   r2   r   arrayquantization)r   r   r   r4   vr   r   r   DQT   s    	'rY   ZSOF0zBaseline DCTi  ZSOF1zExtended Sequential DCTi  ZSOF2zProgressive DCTi  ZSOF3zSpatial losslessi  ZDHTzDefine Huffman tablei  ZSOF5zDifferential sequential DCTi  ZSOF6zDifferential progressive DCTi  ZSOF7zDifferential spatiali  JPG	Extensioni  ZSOF9zExtended sequential DCT (AC)i  ZSOF10zProgressive DCT (AC)i  ZSOF11zSpatial lossless DCT (AC)i  ZDACz%Define arithmetic coding conditioningi  ZSOF13z Differential sequential DCT (AC)i  ZSOF14z!Differential progressive DCT (AC)i  ZSOF15zDifferential spatial (AC)i  RST0	Restart 0i  RST1	Restart 1i  RST2	Restart 2i  RST3	Restart 3i  RST4	Restart 4i  RST5	Restart 5i  RST6	Restart 6i  RST7	Restart 7i  SOIStart of imagei  EOIEnd of imagei  ZSOSzStart of scani  zDefine quantization tablei  ZDNLzDefine number of linesi  ZDRIzDefine restart intervali  ZDHPzDefine hierarchical progressioni  ZEXPzExpand reference componenti  ZAPP0zApplication segment 0i  ZAPP1zApplication segment 1i  ZAPP2zApplication segment 2i  ZAPP3zApplication segment 3i  ZAPP4zApplication segment 4i  ZAPP5zApplication segment 5i  ZAPP6zApplication segment 6i  ZAPP7zApplication segment 7i  ZAPP8zApplication segment 8i  ZAPP9zApplication segment 9i  ZAPP10zApplication segment 10i  ZAPP11zApplication segment 11i  ZAPP12zApplication segment 12i  ZAPP13zApplication segment 13i  ZAPP14zApplication segment 14i  ZAPP15zApplication segment 15i  JPG0Extension 0i  JPG1Extension 1i  JPG2Extension 2i  JPG3Extension 3i  JPG4Extension 4i  JPG5Extension 5i  JPG6Extension 6i  JPG7Extension 7i  JPG8Extension 8i  JPG9Extension 9i  JPG10Extension 10i  JPG11Extension 11i  JPG12Extension 12i  JPG13Extension 13i  Commenti  c             C   s   |  d d  d k S)Nr   r   s   r   )prefixr   r   r   _accept$  s    r   c               @   sX   e  Z d  Z d Z 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  j d  } t |  d k r3 t d   n  d |  _ |  _ g  |  _ i  |  _ i  |  _ i  |  _	 i  |  _
 g  |  _ g  |  _ xJt |  } | d k r | |  j  j d  } t |  } n |  j  j d  } q | t k r}t | \ } } } | d  k	 r| |  |  n  | d k rh|  j } |  j d k r?d } n  d d |  j d | d	 f f g |  _ Pn  |  j  j d  } q | d k s| d
 k rd } q | d k r|  j  j d  } q t d   q Wd  S)Nr      znot a JPEG filer   i  r:   zCMYK;Ijpeg i  s   i   zno marker found)r   r   )r   r   r   r2   rH   rI   rO   Z
huffman_dcZ
huffman_acrW   r(   r)   r-   r   MARKERrJ   rG   tile)r   r4   rQ   namedescriptionhandlerrawmoder   r   r   _open0  sF    										zJpegImageFile._openc       	      C   s  t  |  j  d k r d  S|  j r& d  S|  j d \ } } } } d } | d d k ry | d k ry | |  _ | d f } n  | rqt |  j d | d |  j d | d  } x* d d d	 d g D] } | | k r Pq q W| d | d | d	 | d | d | | d | d
 | d | d | | d f } |  j d | d | |  j d | d | f |  _ | } n  | | | | f g |  _ | d f |  _ |  S)Nr   r   r9   r8   YCbCrr   r   r   r   r&   )r8   r   )rL   r   ZdecoderconfigrJ   minrG   )	r   rJ   rG   deoaZscaler4   r   r   r   draftd  s(    		-Z5	zJpegImageFile.draftc             C   s  d d  l  } d d  l } d d  l } | j   \ } } | j |  | j j |  j  rw | j d d | |  j g  n t	 d   z) t
 j |  } | j   | j |  _ Wd  y | j |  Wn t k
 r Yn XX|  j j |  _ |  j j |  _ g  |  _ d  S)Nr   Zdjpegz-outfilezInvalid Filename)
subprocesstempfileosmkstempclosepathexistsfilename
check_call
ValueErrorr   openloadimunlinkOSErrorrJ   rG   r   )r   r   r   r   fr   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_descriptionr   r   r   r/   r   r   r   r   r   r   +  s   4r   c                s)   d d       f d d   |  j    D S)Nc          	   S   s=   y. t  |   d k r- t |  t  r- |  d SWn Yn X|  S)Nr   r   )rL   
isinstancedict)valuer   r   r   _fixup  s    "z_fixup_dict.<locals>._fixupc                s%   i  |  ] \ } }   |  |  q Sr   r   ).0krX   )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 } Wn t k
 r) d  SYn Xt j | d d    } | j d  } t j |  } | j |  t t	 |   } y | j
 | d  Wn t t f k
 r Yn0 Xt j |  } | j |  | j t	 |   y | j
 | d  Wn t t f k
 rYn- Xt j |  } | j |  t	 |  | d <| S)Nr!   rE   r   ii  i%  )r+   r1   ioBytesIOr   r   ZImageFileDirectory_v1r   r   r   seekr0   update)r   datafileheadr+   r!   r   r   r   r/     s0    	r/   c          "   C   s  y |  j  d } Wn t k
 r) d  SYn Xt j |  } | j d  } | d  d  d k rd d n d } y, t j |  } | j |  t |  } Wn t	 d   Yn Xy | d } Wn t k
 r t	 d	   Yn Xg  } yz| d
 }	 x_t
 d |  D]N}
 t j d j |  |	 |
 d  } d3 } t t | |   } i t | d d4 @ d 6t | d d5 @ d 6t | d d6 @ d 6| d d7 @d ?d 6| d d8 @d ?d 6| d d  @d! 6} | d d k rd" | d <n t	 d#   i d$ d 6d% d& 6d' d( 6d) d* 6d+ d, 6d- d. 6d/ d0 6} | j | d! d1  | d! <| | d <| j |  q W| | d
 <Wn t k
 r|t	 d2   Yn X| S)9Nr%   r   r   s   MM *><z)malformed MP Index (unreadable directory)i  z(malformed MP Index (no number of images)i  r   z{}LLLHHrF   	AttributeSize
DataOffsetEntryNo1EntryNo2r      ZDependentParentImageFlag   ZDependentChildImageFlag   ZRepresentativeImageFlagr&      ZReservedr      ZImageDataFormati ZMPTyper   z!unsupported picture format in MPOZ	Undefinedz Large Thumbnail (VGA Equivalent)i  z$Large Thumbnail (Full HD Equivalent)i  zMulti-Frame Image (Panorama)i  zMulti-Frame Image: (Disparity)i  z Multi-Frame Image: (Multi-Angle)i  zBaseline MP Primary Imagei   Unknownz!malformed MP Index (bad MP Entry))z	AttributezSizer   r   r   l        i   @i    i   i   )r+   r1   r   r   r   r   ZImageFileDirectory_v2r   r   r2   rN   structunpack_fromr   zipboolgetr*   )r   r   file_contentsr   Z
endiannessr+   r%   ZquantZ	mpentriesZrawmpentriesZentrynumZunpackedentrylabelsZmpentryZmpentryattrZ	mptypemapr   r   r   r     sn    	"
 




r   r8   1r9   ZRGBXzCMYK;Ir:   r   r   rE   rB   r   r      r   r   r   rA   rF      r   *   r&   r   r"         r   )   +   	         r   r   (   ,   5   r             '   -   4   6         !   &   .   3   7   <      "   %   /   2   8   ;   =   #   $   0   1   9   :   >   ?   c                sc     f d d   t  t     D   x7 t    D]) \ }   f d d   t D   | <q2 W  S)Nc                s&   g  |  ] } |   k r   |  q Sr   r   )r   key)qtablesr   r   
<listcomp>F  s   	 z(convert_dict_qtables.<locals>.<listcomp>c                s   g  |  ] }   |  q Sr   r   )r   rQ   )tabler   r   r  H  s   	 )rN   rL   	enumeratezigzag_index)r
  idxr   )r
  r  r   convert_dict_qtablesE  s    %!r  c             C   st   t  |  d  s |  j d k r# d S|  j d d d  |  j d d d  |  j d d d  } t j | d	  S)
NrI   r   r   r   r&   r   )r   r   r  )hasattrrI   rO   	samplingsr   )r   Zsamplingr   r   r   get_samplingL  s    Ar  c             C   s  y t  |  j } Wn% t k
 r8 t d |  j   Yn X|  j } d d   | j d d)  D } | j d d  } | j d d*  } | j d	  } | d
 k r d } d
 } d
 } n | t k r t | }	 d } |	 j d d+  } |	 j d  } nq t | t  st	 d   nS | t k r8t | j d d,  } n  t
 |  rf| t k rft | j d  } n  | d k r{d } nx | d k rd } nc | d k rd } nN | d k rd } n9 | d
 k r|  j d k rt	 d   n  t |   } n  d d   }
 | d
 k r>|  j d k r)t	 d   n  t |  d d   } n  |
 |  } d } | j d  } | r)d } d } | | } g  } x1 | r| j | d  |   | | d   } qWd } xk | D]` } t j d d | t |   } | d | d t |  t t |   | 7} | d 7} qWn  | j d d  pJ| j d d  } | j d  d  } | | | j d! d  | | j d" d  | d | d | | | | j d# d  f |  _ d } | s| rG|  j d$ k rd% |  j d |  j d } qG| d& k s| d k r,d |  j d |  j d } qG|  j d |  j d } n  t t j | t | j d# d   d' t |  d  } t j |  | d( d- |  j d | f g |  d  S).Nzcannot write mode %s as JPEGc             S   s"   g  |  ] } t  t |    q Sr   )intround)r   xr   r   r   r  c  s   	 z_save.<locals>.<listcomp>r   r   qualitysubsamplingr   r
  keeprW   zInvalid quality settingz4:4:4z4:2:2z4:2:0r   z4:1:1r   z3Cannot use 'keep' when original image is not a JPEGc                s  |  d  k r |  St  |   r y d d   |  j   D   Wn t k
 rY t d   Yq X  f d d   t d t    d  D }  n  t |  t t t f  rt |  t  r t	 |   }  n t |  t  r t |   }  n  d t |   k  o d k  n st d   n  xy t
 |   D]k \ } } y. t |  d k rA  n  t j d	 |  } Wn t k
 rtt d   YqXt |  |  | <qW|  Sd  S)
Nc             S   s?   g  |  ]5 } | j  d  d  d j    D] } t |   q& q S)#r   r   )splitr  )r   line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 tablesrU   )r   
splitlinesr   rN   rL   r   tuplelistr   r  r  rV   r0   )r
  r  r  r   )r   r   validate_qtables  s0    ."z_save.<locals>.validate_qtablesrC   rD   rB   i  z>Hs   s   ICC_PROFILE r?   Fr@   optimizeZsmoothZ
streamtyper!   r:   r   _   r   r   )r   r   r  r  r  )r   r   )RAWMODErJ   r1   IOErrorZencoderinfor   r
   r   r  r   r   r   r  getattrr*   r   packrL   r   ZencoderconfigrG   maxr   ZMAXBLOCK_save)r   r   r   r   r+   r   r  r  r
  presetr$  extrarD   ZICC_OVERHEAD_LENZMAX_BYTES_IN_MARKERZMAX_DATA_BYTES_IN_MARKERmarkersrQ   r   rG   r?   r%  bufsizer   r   r   r,  Z  s    		
				
	 -%r,  c             C   sg   d d  l  } d d  l } |  j   } | j d d | | g  y | j |  Wn t k
 rb Yn Xd  S)Nr   Zcjpegz-outfile)r   r   _dumpr   r   r   )r   r   r   r   r   r   r   r   r   _save_cjpeg  s    r2  c             C   s   t  |  |  } yB | j   } | d d k rP d d l m } | |  |  } n  Wn6 t t f k
 rk Yn t k
 r t j d  Yn X| S)Ni  r   )MpoImageFilezTImage appears to be a malformed MPO file, it will be interpreted as a base JPEG file)	r   r   ZMpoImagePluginr3  r0   
IndexErrorr2   warningswarn)r   r   r   Zmpheaderr3  r   r   r   jpeg_factory  s    r7  z.jfifz.jpez.jpgz.jpegz
image/jpeg)rZ   z	ExtensionN)r\   r]   N)r^   r_   N)r`   ra   N)rb   rc   N)rd   re   N)rf   rg   N)rh   ri   N)rj   rk   N)rl   rm   N)rn   ro   N)rp   rq   N)rr   rs   N)rt   ru   N)rv   rw   N)rx   ry   N)rz   r{   N)r|   r}   N)r~   r   N)r   r   N)r   r   N)r   r   N)r   r   N)r   r   N)r   r   N)@r   r   r   rE   rB   r   r   r   r   r   r   rA   rF   r   r   r   r&   r   r"   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   ),
__future__r   rV   r   r   r5  r   r   r   r   Z_binaryr   r   r	   r   ZJpegPresetsr
   Z_utilr   __version__r   r6   r7   rS   rY   r   r   r   r   r/   r   r'  r  r  r  r  r,  r2  r7  Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>#   s   T
0{-L
       

