o
    jQO                    @  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	m
Z
mZ d dlmZ d dlmZmZ d dlmZmZmZ ddlmZmZmZ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#m$Z$ ddlm%Z% dZ&e&rd dl	m'Z' d dlm(Z( ddl)m*Z*m+Z+m,Z, e-e.Z/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>dZ?d Z@d!ZAd"ZBd#ZCd$ZDd%ZEd&ZFd'ZGd(ZHd)ZId*ZJd+ZKd,ZLd-ZMd.ZNd/ZOd0ZPd1ZQd2ZRd3ZSd4ZTd5ZUd6ZVd7ZWd8ZXd9ZYd:ZZd;Z[d<Z\d=Z]i dd>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^Z^d_d` e^_ D Z`i e3d daddadbfdce4d daddadbfdce3d dad?dadbfdde4d dad?dadbfdde3ddaddadbfdee4ddaddadbfdee3ddad?dadbfdfe4ddad?dadbfdfe3d daddgdbfdhe4d daddgdbfdhe3d dad?dgdbfdie4d dad?dgdbfdie3ddaddgdbfdje4ddaddgdbfdje3ddad?dgdbfdke4ddad?dgdbfdke3d daddldbfdmi e4d daddldbfdme3d dad?dldbfdne4d dad?dldbfdne3ddaddldbfdoe4ddaddldbfdoe3ddad?dldbfdpe4ddad?dldbfdpe3d daddqdbfdre4d daddqdbfdre3d dad?dqdbfdse4d dad?dqdbfdse3ddaddqdbfdte4ddaddqdbfdte3ddgddqdbfdte4ddgddqdbfdte3ddad?dqdbfdue4ddad?dqdbfdui e3ddaddvdbfdwe3d daddxdbfdye3ddaddxdbfdye4ddaddxdbfdze3ddad?dxdbfd{e3ddgddxdbfd|e4ddgddxdbfd}e3d d~dddbfde4d d~dddbfde3ddadddbfde3ddgdddbfde4ddgdddbfde3dd~dddbfde4dd~dddbfde3ddadddgfde4ddadddgfde3d?dadddbfdi e4d?dadddbfde3d?dad?ddbfde4d?dad?ddbfde3d?dadddbfde4d?dadddbfde3d?dadddfde4d?dadddfde3d?dadddfde4d?dadddfde3d?dadddfde4d?dadddfde3d?dadddafde4d?dadddafde3d?dadddfde4d?dadddfde3d?dadddfde4d?dadddfdi e3d?dadddgfde4d?dadddgfde3d?dadddfde4d?dadddfde3d?dadddfde4d?dadddfde3d?dadddfde4d?dadddfde3d?dadddbfde4d?dadddbfde3d?dadddbfde4d?dadddbfde3d?dadddfde4d?dadddfde3d?dadddafde4d?dadddafde3d?dadddgfdi e4d?dadddgfde3dAdaddadbfde4dAdaddadbfde3dAdad?dadbfde4dAdad?dadbfde3dAdaddgdbfde4dAdaddgdbfde3dAdad?dgdbfde4dAdad?dgdbfde3dAdaddldbfde4dAdaddldbfde3dAdad?dldbfde4dAdad?dldbfde3dAdaddqdbfde4dAdaddqdbfde3dAdadddfde4dAdadddfdi e3dAdadddgfde4dAdadddgfde3dAdad?dqdbfde4dAdad?dqdbfde3dEdadddbfde4dEdadddbfde3dEdadddfde4dEdadddfde3dEdadddfde4dEdadddfde3dEdadddbfde4dEdadddbfde3dGdaddqdbfdte4dGdaddqdbfdte3dGdadddbfde4dGdadddbfde3dKdadddbfde4dKdadddbfdiZaebdd eaD Zcg dZdd
ddZedddǄZfddd˄Zgi Zhi ZidddЄZjG ddȄ deZke
delemgef ZndddׄZodddڄZpddd߄Zqe&reeref ZsneZsG dd҄ desZtehet_heiet_ie%_ D ]#\ZuZvevwddZvexetdev eheu d  exetdev eieu  q[h[i[u[vG dd detZyeyZzG dd dejZ{i dde3dddadfdde3dddqdfdde3dddd?fdde3dAddqdfdde3dAddd?fdde3dd?ddfdde3dddxdfdde3dddxdfdde3ddAddfdde3d?dddfdde3d?ddd fdde3d?ddd?fdde3dEdddfdde3dGdddfdde3dKdddfdde4dddxdfZ|dddZ}G dd dej~ZdddZee{je{ee ee{je} ee{je ee{jddg ee{jd	 dS (      )annotationsN)CallableMutableMapping)Fraction)NumberRational)IOAnycast   )ExifTagsImage	ImageFileImageOpsImagePaletteTiffTags)i16be)i32beo8)DeferredErroris_pathTYPESF)Iterator)NoReturn)BufferIntegralLikeStrOrBytesPath   s   IIs   MM      i  i  i  i  i
  i    i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  iB  iC  D  iE  iJ  iR  iS  i[  i  i  i  i  iI  is  ii  i  i  i  i  raw   Z
tiff_ccitt   Zgroup3   Zgroup4   Ztiff_lzw   	tiff_jpeg   jpeg   tiff_adobe_deflatei  Ztiff_raw_16i  Zpackbitsi)  Ztiff_thunderscani  tiff_deflateit  Ztiff_sgilogiu  Ztiff_sgilog24im  lzmaiP  zstdiQ  Zwebpc                 C  s   i | ]\}}||qS  r2   ).0kvr2   r2   T/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/PIL/TiffImagePlugin.py
<dictcomp>   s    r7   r   r2   )1z1;I)r9   z1;IR)r9   r9   )r9   z1;R)r%   )LzL;2I)r:   zL;2IR)r:   zL;2)r:   zL;2R)r'   )r:   zL;4I)r:   zL;4IR)r:   zL;4)r:   zL;4R)r-   )r:   zL;I)r:   zL;IR)r:   r:   )r:   zL;R)   )I;16zI;12)   )r<   r<   )I;16Br>   )r<   zI;16R)IzI;16S)r?   zI;16BS)r&   )    )FF;32F)rA   zF;32BF)r?   zI;32N)r?   I;32S)r?   zI;32BS)r-   r-   )LArD   )r-   r-   r-   )RGBrE   )rE   zRGB;R)r-   r-   r-   r-   )RGBArF   r   )rE   RGBX)r-   r-   r-   r-   r-   r   r   )rE   ZRGBXX)r-   r-   r-   r-   r-   r-   )r   r   r   )rE   ZRGBXXX)rF   ZRGBa)r   r   )rF   ZRGBaX)r   r   r   )rF   ZRGBaXX)r%   r   )rF   ZRGBAX)r%   r   r   )rF   ZRGBAXX)i  )r=   r=   r=   )rE   zRGB;16L)rE   zRGB;16B)r=   r=   r=   r=   )rF   zRGBA;16L)rF   zRGBA;16B)rE   zRGBX;16L)rE   zRGBX;16B)rF   zRGBa;16L)rF   zRGBa;16B)PzP;1)rJ   zP;1R)rJ   zP;2)rJ   zP;2R)rJ   zP;4)rJ   zP;4R)rJ   rJ   )rJ   ZPX)PArK   )rJ   zP;R)CMYKrL   )rL   ZCMYKX)rL   ZCMYKXX)rL   zCMYK;16L)rL   zCMYK;16B)LABrM   c                 c  s    | ]	}t |d  V  qdS )r'   N)len)r3   Zkey_tpr2   r2   r6   	<genexpr>      rO   )s   MM *s   II* s   MM* s   II *s   MM +s   II+ prefixbytesreturnboolc                 C  s   |  ttS N)
startswithtuplePREFIXESrQ   r2   r2   r6   _accept"     rZ   valfloat | Fraction | IFDRationalmax_valint!tuple[IntegralLike, IntegralLike]c                 C  s<   t | dk}t|rd|  n| |}|r|d d d S |S )Nr   )absIFDRationallimit_rational)r\   r^   invn_dr2   r2   r6   _limit_rational&  s   rg   rc   min_valc                 C  sp   t | }|j|jf}tdd |D |k rt| t|}tdd |D }t||kr6t|d |d  |}|S )Nc                 s      | ]}t |V  qd S rU   floatr3   ir2   r2   r6   rO   4      z)_limit_signed_rational.<locals>.<genexpr>c                 s  ri   rU   rj   rl   r2   r2   r6   rO   7  rn   r   r   )r   	numeratordenominatorminrg   rb   rW   max)r\   r^   rh   fracrf   Z	n_d_floatr2   r2   r6   _limit_signed_rational.  s   rt   opstrr	   c                   s   d	 fdd}|S )
Nselfrc   argstuple[float, ...]rS   bool | float | Fractionc                   s   t | j | S rU   )getattr_valrw   rx   ru   r2   r6   delegateF  s   z_delegate.<locals>.delegate)rw   rc   rx   ry   rS   rz   r2   )ru   r   r2   r~   r6   	_delegateE  s   r   c                   @  sd  e Zd ZdZ	 dZ	dAdBd
dZedCddZedDddZdEddZ	dFddZ
dDddZdGddZdHd d!ZdId#d$Z	 ed%Zed&Zed'Zed(Zed)Zed*Zed+Zed,Zed-Zed.Zed/Zed0Zed1Zed2Zed3Zed4Zed5Z ed6Z!ed7Z"ed8Z#ed9Z$ed:Z%ed;Z&ed<Z'ed=Z(ed>Z)e*e+d?red?Z,d@S d@S )Jrc   zImplements a rational class where 0/0 is a legal value to match
    the in the wild use of exif rationals.

    e.g., DigitalZoomRatio - 0.00/0.00  indicates that no digital zoom was used
    )
_numerator_denominatorr|   r   valuer]   rp   r_   rS   Nonec                 C  s   |  t |tr|j| _|j| _|j| _dS t |tr#|j| _|j| _ntr,t	t
|| _n|| _|| _|dkr=td| _dS |dkrHt|| _dS t||krXtt||| _dS t|| | _dS )z
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        Nr   nanr   )
isinstancerc   ro   r   rp   r   r|   r   TYPE_CHECKINGr
   r   rk   r_   )rw   r   rp   r2   r2   r6   __init__\  s(   


zIFDRational.__init__r   c                 C     | j S rU   )r   rw   r2   r2   r6   ro   ~     zIFDRational.numeratorc                 C  r   rU   )r   r   r2   r2   r6   rp     r   zIFDRational.denominatormax_denominatortuple[IntegralLike, int]c                 C  s>   | j dkr| j| j fS t| jtsJ | j|}|j|j fS )z

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )rp   ro   r   r|   r   limit_denominator)rw   r   fr2   r2   r6   rd     s
   
zIFDRational.limit_rationalrv   c                 C  s   t t| jS rU   )rv   rk   r|   r   r2   r2   r6   __repr__  r[   zIFDRational.__repr__c                 C  s
   | j  S rU   )r|   __hash__r   r2   r2   r6   r        
zIFDRational.__hash__otherobjectrT   c                 C  s0   | j }t|tr|j }t|trt|}||kS rU   )r|   r   rc   rk   )rw   r   r\   r2   r2   r6   __eq__  s   

zIFDRational.__eq__%list[float | Fraction | IntegralLike]c                 C  s   | j | j| jgS rU   )r|   r   r   r   r2   r2   r6   __getstate__     zIFDRational.__getstate__statec                 C  s^   t | d |\}}}t|ttfsJ || _tr tt|| _	n|| _	t|t
s*J || _d S Nr   )rc   r   r   rk   r   r|   r   r
   r   r   r_   r   )rw   r   r|   r   r   r2   r2   r6   __setstate__  s   

zIFDRational.__setstate____add____radd____sub____rsub____mul____rmul____truediv____rtruediv____floordiv____rfloordiv____mod____rmod____pow____rpow____pos____neg____abs__	__trunc____lt____gt____le____ge____bool____ceil__	__floor__	__round____int__Nr8   )r   r]   rp   r_   rS   r   )rS   r   rS   r_   )r   r_   rS   r   rS   rv   )r   r   rS   rT   )rS   r   )r   r   rS   r   )-__name__
__module____qualname____doc__	__slots__r   propertyro   rp   rd   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   hasattrr   r   r2   r2   r2   r6   rc   N  s\    "






ImageFileDirectory_v2idxsize$Callable[[_LoaderFunc], _LoaderFunc]c                   s   d fdd}|S )Nfunc_LoaderFuncrS   c                   sB   ddl m} | jdr| jdd  dd| < | ft < | S )Nr   r   load_r(   _ )r   r   r   rV   replace_load_dispatch)r   r   r   r   r2   r6   	decorator  s
   z#_register_loader.<locals>.decorator)r   r   rS   r   r2   )r   r   r   r2   r   r6   _register_loader  s   r   2Callable[[Callable[..., Any]], Callable[..., Any]]c                   s   d fdd}|S )Nr   Callable[..., Any]rS   c                   s   | t  < | S rU   )_write_dispatch)r   r   r2   r6   r     s   z#_register_writer.<locals>.decorator)r   r   rS   r   r2   )r   r   r2   r   r6   _register_writer  s   r   idx_fmt_nametuple[int, str, str]r   c                   sb   ddl m} | \} }|||< td  	dd fdd}|ft|<  fddt|< d S )Nr   r   =Trw   r   datarR   
legacy_apirT   rS   tuple[Any, ...]c                   s   |  t|    |S rU   )_unpackrN   rw   r   r   fmtr   r2   r6   basic_handler  s   z&_register_basic.<locals>.basic_handlerc                   s   d  fdd|D S )N    c                 3  s    | ]	}  |V  qd S rU   )_packr3   r   )r   rw   r2   r6   rO     rP   z4_register_basic.<locals>.<lambda>.<locals>.<genexpr>joinrw   values)r   r   r6   <lambda>  s   z!_register_basic.<locals>.<lambda>T)rw   r   r   rR   r   rT   rS   r   )r   r   structcalcsizer   r   )r   r   r   namer   r2   r   r6   _register_basic  s   
r   c                   @  sR  e Zd ZU dZi Zded< i Zded< 			d}d~ddZedd Z	edd Z
edddZejdddZdddZdddZdd!d"Zdd$d%Zdd(d)Zdd+d,Zdd-d.Zdd0d1Zdd2d3Zdd5d6Zdd:d;Zdd=d>Zeeeejd?d@fejdAdBfejdCdDfej dEdFfej!dGdHfej"dIdJfej#dKdLfej$dAdBfej%dMdNfg	 e&dOdOdddQdRZ'e(dOddTdUZ)e&dVdOdddWdXZ*e(dVddZd[Z+e&d\d]	Pddd_d`Z,e(d\ddbdcZ-e&dddOdddedfZ.e(ddddgdhZ/e&did]	PdddjdkZ0e(diddldmZ1ddqdrZ2ddsdtZ3ddudvZ4dddydzZ5dd{d|Z6dS )r   a  This class represents a TIFF tag directory.  To speed things up, we
    don't decode tags unless they're asked for.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v2()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        'Some Data'

    Individual values are returned as the strings or numbers, sequences are
    returned as tuples of the values.

    The tiff metadata type of each item is stored in a dictionary of
    tag types in
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types
    are read from a tiff file, guessed from the type added, or added
    manually.

    Data Structures:

        * ``self.tagtype = {}``

          * Key: numerical TIFF tag number
          * Value: integer corresponding to the data type from
            :py:data:`.TiffTags.TYPES`

          .. versionadded:: 3.0.0

    'Internal' data structures:

        * ``self._tags_v2 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data, as tuple for multiple values

        * ``self._tagdata = {}``

          * Key: numerical TIFF tag number
          * Value: undecoded byte string from file

        * ``self._tags_v1 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data in the v1 format

    Tags will be found in the private attributes ``self._tagdata``, and in
    ``self._tags_v2`` once decoded.

    ``self.legacy_api`` is a value for internal use, and shouldn't be changed
    from outside code. In cooperation with
    :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api``
    is true, then decoded tags will be populated into both ``_tags_v1`` and
    ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF
    save routine. Tags should be read from ``_tags_v1`` if
    ``legacy_api == true``.

    z"dict[int, tuple[int, _LoaderFunc]]r   zdict[int, Callable[..., Any]]r      II*     NifhrR   rQ   bytes | Nonegroup
int | NonerS   r   c                 C  s   t |sdt| d}t||dur|n|dd | _| jtkr&d| _n| jtkr/d| _nd}t||d dk| _|| _i | _		 | 
  | jrV| d	|d
d d n| d|dd d | _d| _dS )a  Initialize an ImageFileDirectory.

        To construct an ImageFileDirectory from a real file, pass the 8-byte
        magic header to the constructor.  To only set the endianness, pass it
        as the 'prefix' keyword argument.

        :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets
              endianness.
        :param prefix: Override the endianness of the file.
        znot a TIFF file (header z not valid)Nr%   ><znot a TIFF IFD+   Qr-   r   r:   r'   F)rZ   reprSyntaxError_prefixMM_endianII_bigtiffr   tagtyperesetr   next_legacy_api)rw   r   rQ   r   msgr2   r2   r6   r   G  s(   


zImageFileDirectory_v2.__init__c                 C  r   rU   )r   r   r2   r2   r6   r   n      zImageFileDirectory_v2.<lambda>c                 C  r   rU   )_offsetr   r2   r2   r6   r   o  r   rT   c                 C  r   rU   )r   r   r2   r2   r6   r   q  r   z ImageFileDirectory_v2.legacy_apir   r   c                 C  s   d}t |)Nz"Not allowing setting of legacy api)	Exception)rw   r   r   r2   r2   r6   r   u  s   c                 C  s(   i | _ i | _i | _i | _d | _d | _d S rU   )_tags_v1_tags_v2_tagdatar   _nextr  r   r2   r2   r6   r   z  s   
zImageFileDirectory_v2.resetrv   c                 C  s   t t| S rU   )rv   dictr   r2   r2   r6   __str__     zImageFileDirectory_v2.__str__dict[str, Any]c                   s    fdd   D S )z
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        c                   s"   i | ]\}}t | jj|qS r2   )r   lookupr   r   )r3   coder   r   r2   r6   r7     s    z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsr   r2   r   r6   named  s   
zImageFileDirectory_v2.namedr_   c                 C     t t| jt| jB S rU   )rN   setr  r  r   r2   r2   r6   __len__     zImageFileDirectory_v2.__len__tagr	   c                 C  sf   || j vr| j| }| j| }| j| \}}|| || j| |< | j | }| jr1t|ttfs1|f}|S rU   )r  r  r   r   r   r   rW   rR   )rw   r  r   typr   handlerr\   r2   r2   r6   __getitem__  s   



z!ImageFileDirectory_v2.__getitem__r   c                 C     || j v p	|| jv S rU   )r  r  rw   r  r2   r2   r6   __contains__     z"ImageFileDirectory_v2.__contains__c                 C  s   |  ||| j d S rU   )_setitemr   )rw   r  r   r2   r2   r6   __setitem__  r  z!ImageFileDirectory_v2.__setitem__r   c              
     s  t ttf}t|| j t||r|gn|}|| jvr jr% j| j|< ntj	| j|< t
dd |D rS|D ]}t|ts?J |dk rKtj| j|<  nq6tj| j|< nt
dd |D rd}d}d}	|D ]/}t|tsmJ |r|d|  krydk s|n d}|rd|  k rd	k sn d}|	r|dk rd}	qd|rtj| j|< nH|rtj| j|< n?|	rtj| j|< n6tj| j|< n/t
d
d |D rtj| j|< nt
dd |D rtj| j|< nt
dd |D rtj| j|< | j| tj	krdd |D }n| j| tjkrdd |D }| j| tjkot|t}
|
s!t fdd|D }|r'| jn| j}|
s jdksL| j| tjksL jd u rt|dkr|s|r^| j| tjtjfv r^|f}z|\||< W d S  ty   td| dt| d |d ||< Y d S w |||< d S )Nc                 s      | ]}t |tV  qd S rU   )r   rc   r3   r5   r2   r2   r6   rO         z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>r   c                 s  r  rU   )r   r_   r  r2   r2   r6   rO     r  Tr   Fi i   c                 s  r  rU   )r   rk   r  r2   r2   r6   rO     r  c                 s  r  rU   )r   rv   r  r2   r2   r6   rO     r  c                 s  r  rU   )r   rR   r  r2   r2   r6   rO     r  c                 S  s&   g | ]}t |tr|d dn|qS )asciir   )r   rv   encoder  r2   r2   r6   
<listcomp>  s    z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S  s"   g | ]}t |trt|n|qS r2   )r   r_   rk   r  r2   r2   r6   r"    s   " c                 3  s(    | ]}t |tr |n|V  qd S rU   )r   rv   Zcvt_enumr   infor2   r6   rO     s
    
r   zMetadata Warning, tag z had too many entries: z, expected 1)r   rR   rv   r   r  r   r   r   type	UNDEFINEDallrc   ZSIGNED_RATIONALZRATIONALr_   SHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr  rW   r  r  lengthrN   
ValueErrorwarningswarn)rw   r  r   r   Z	basetypesr   r5   shortZsigned_shortlongis_ifddestr2   r#  r6   r    s   

 zImageFileDirectory_v2._setitemc                 C  s.   | j |d  | j|d  | j|d  d S rU   )r  popr  r  r  r2   r2   r6   __delitem__  s   z!ImageFileDirectory_v2.__delitem__Iterator[int]c                 C  r  rU   )iterr  r  r  r   r2   r2   r6   __iter__  r  zImageFileDirectory_v2.__iter__r   r   r   c                 C  s   t | j| |S rU   )r   unpackr   )rw   r   r   r2   r2   r6   r   
     zImageFileDirectory_v2._unpackr   c                 G  s   t j| j| g|R  S rU   )r   packr   )rw   r   r   r2   r2   r6   r     r  zImageFileDirectory_v2._packHr3  r:   r4  bzsigned bytehzsigned shortlzsigned longr   rk   ddoubler   Zlong8r   Tc                 C     |S rU   r2   r   r2   r2   r6   	load_byte!     zImageFileDirectory_v2.load_bytebytes | int | IFDRationalc                 C  s*   t |tr	t|}t |trt|f}|S rU   )r   rc   r_   rR   rw   r   r2   r2   r6   
write_byte%  s
   


z ImageFileDirectory_v2.write_byter%   c                 C  s"   | dr|d d }|ddS )N    ra   zlatin-1r   )endswithdecoder   r2   r2   r6   load_string-  s   
z!ImageFileDirectory_v2.load_stringstr | bytes | intc                 C  s0   t |tr	t|}t |ts|dd}|d S )Nr   r   rK  )r   r_   rv   rR   r!  rw   r   r2   r2   r6   write_string3  s
   

z"ImageFileDirectory_v2.write_stringr(   r-   )tuple[tuple[int, int] | IFDRational, ...]c                   X   |  t|d  d|}dfdd	 t fd
dt|d d d |dd d D S )Nr'   r:   ar_   r@  rS   tuple[int, int] | IFDRationalc                       r| |fS t | |S rU   rc   rT  r@  r   r2   r6   combineB     z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3      | ]
\}} ||V  qd S rU   r2   r3   numdenomrZ  r2   r6   rO   E      z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r%   r   rT  r_   r@  r_   rS   rU  r   rN   rW   ziprw   r   r   valsr2   rZ  r   r6   load_rational<     0z#ImageFileDirectory_v2.load_rationalrc   c                      d  fdd|D S )Nr   c                 3  s(    | ]} j d gt|dR  V  qdS )Z2Ll    N)r   rg   r3   rs   r   r2   r6   rO   I  s    
z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r   r   r2   r   r6   write_rationalG  s   z$ImageFileDirectory_v2.write_rationalr+   c                 C  rE  rU   r2   r   r2   r2   r6   load_undefinedM  rG  z$ImageFileDirectory_v2.load_undefinedc                 C  s0   t |tr	t|}t |trt|dd}|S )Nr   r   )r   rc   r_   rv   r!  rP  r2   r2   r6   write_undefinedQ  s
   

z%ImageFileDirectory_v2.write_undefined
   c                   rS  )Nr'   rB  rT  r_   r@  rS   rU  c                   rV  rU   rW  rX  rY  r2   r6   rZ  _  r[  z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  r\  rU   r2   r]  r`  r2   r6   rO   b  ra  z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r%   r   rb  rc  re  r2   rg  r6   load_signed_rationalY  ri  z*ImageFileDirectory_v2.load_signed_rationalc                   rj  )Nr   c                 3  s*    | ]} j d gt|ddR  V  qdS )Z2lii   N)r   rt   rk  r   r2   r6   rO   f  s
    
z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r   r   r2   r   r6   write_signed_rationald  s   z+ImageFileDirectory_v2.write_signed_rationalfp	IO[bytes]r   c                 C  s8   | |}t||krd| dt| d}t||S )Nz&Corrupt EXIF data.  Expecting to read  bytes but only got z. )readrN   OSError)rw   rr  r   retr   r2   r2   r6   _ensure_readk  s   
z"ImageFileDirectory_v2._ensure_readc              
   C  st  |    | | _z| jr| d| |dn	| d| |dd }t|D ]}| jr7| d| |dn	| d| |d	\}}}}t|| j	j
}t|d
}	d| d| d|	 d| d	}
z	| j| \}}W n ty{   td|
| Y q(w || }|| jrdndkr| }| | jrdnd|\}|
d| d| 7 }
|| t||}|| n|d | }t||krtd| dt| d|  t|
 q(|st|
 q(|| j|< || j|< |
d7 }
|
|dkrd| dnt|7 }
t|
 q(| jr| d| |dn	| d| |d\| _W d S  ty9 }
 ztt|
 W Y d }
~
d S d }
~
ww )Nr   r-   r?  r%   r   HHQ8s   HHL4sr;   unknownztag:  (
) - type: )z%s - unsupported type %sr'   r:   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read rt  z. Skipping tag z
 - value: r@   <table:  bytes>)r   tellr  r   r   rx  ranger   r  r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readrN   r1  r2  r  r   r   r   rv  rv   )rw   rr  Z	tag_countrm   r  r  countr   tagnametypnamer   Z	unit_sizer  r   hereoffsetr2   r2   r6   loadu  sx   






 zImageFileDirectory_v2.loadc                 C  s`   | j | d| jr
dnd }| jr|| ddd7 }|| jr'| dd7 }|S | d	d7 }|S )
Nr?  r   *   HHr-   r   r   r=   r:   )r   r   r   rw   r   r2   r2   r6   _get_ifh  s   zImageFileDirectory_v2._get_ifhr   r  c              
     s`  |  | jrdndt| j}g }| jrdnd}| jrdnd} t|t| j| jr+dnd  | 7  d }t| j D ]\}}|tkrGt|}| j| }	t	d||	t
| |	tjko_t|t}
|
rt|  |d	}| j| }| D ]\}}|||< qs| }nt|tr|n|f}| j|	 | g|R  }t|| jj}|
rd
nt|	d}d| d| d| d|	 d	}|t|dkrdt| dnt|7 }t	| |
rd}n|	tjtjtjfv rt|}nt|}t||kr|||	|||ddf q;|||	||  | |f  t|d d d 7  q;|d urb|| \}}	}}}|rK| j|	 \}} fdd|| || j D }| j|	 | g|R  }n|  || !||d   }||	|||f||< |D ]'\}}	}}}t	d||	|t
|t
| ||  | jrdnd||	||7 }qd||  |d7 }|D ]\}}	}}}||7 }t|d@ r|d7 }q|S )Nr   r?  r:   r-   r'   rz  r;   zTag %s, Type: %s, Value: %s)r   ifdr|  zsave: r}  r~  z) - value: r=   r  r  r   rK  r   r%   c                   s   g | ]}|  qS r2   r2   )r3   r\   r  r2   r6   r"        z1ImageFileDirectory_v2.tobytes.<locals>.<listcomp>r   z%s %s %s %s %sry  r{  )"r   r   rN   r  sortedr  STRIPOFFSETSr   r  r  r   r   r*  r   r  r   r  tobytesrW   r   r  r   r   r   r  rv   r.  r-  r&  appendljustr   r   r   )rw   r  resultentriesr   fmt_sizeZstripoffsetsr  r   r  r5  r  r   Zifd_tagZ	ifd_valuer   r  r  r   r  r   r  r2   r  r6   r    sp   "


(



zImageFileDirectory_v2.tobytesc                 C  sB   |  dkr||   |  }| |}|| |t| S r   )r  writer  r  rN   )rw   rr  r  r  r2   r2   r6   save  s   

zImageFileDirectory_v2.save)r   NN)r   rR   rQ   r   r   r   rS   r   )rS   rT   )r   rT   rS   r   rS   r   r   )rS   r
  r   r  r_   rS   r	   r  r   rS   rT   r  r_   r   r	   rS   r   )r  r_   r   r	   r   rT   rS   r   )r  r_   rS   r   rS   r9  )r   rv   r   rR   rS   r   )r   rv   r   r	   rS   rR   r   )r   rR   r   rT   rS   rR   )r   rH  rS   rR   )r   rR   r   rT   rS   rv   )r   rO  rS   rR   )r   rR   r   rT   rS   rR  )r   rc   rS   rR   )r   rH  rS   rR   )rr  rs  r   r_   rS   rR   )rr  rs  rS   r   )rS   rR   rG   )r  r_   rS   rR   )rr  rs  rS   r_   )7r   r   r   r   r   __annotations__r   r   r   rQ   r  r   setterr   r  r  r  r  r  r  r  r8  r;  r   r   listmapr   r   r(  r*  ZSIGNED_BYTEr)  r+  FLOATr,  ZIFDLONG8r   rF  r   rJ  rN  rQ  rh  rl  rm  rn  rp  rq  rx  r  r  r  r  r2   r2   r2   r6   r     s   
 <'








^

















CPr   r   r   Zwrite_c                      s   e Zd ZU dZd$ fddZed	d
 Zedd
 Zded< 	 e	d%ddZ
d&ddZd'ddZd(ddZd)ddZd*d d!Zd+d"d#Z  ZS ),ImageFileDirectory_v1a  This class represents the **legacy** interface to a TIFF tag directory.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v1()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        ('Some Data',)

    Also contains a dictionary of tag types as read from the tiff image file,
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`.

    Values are returned as a tuple.

    ..  deprecated:: 3.0.0
    rx   r	   kwargsrS   r   c                   s   t  j|i | d| _d S )NT)superr   r   )rw   rx   r  	__class__r2   r6   r   7  s   
zImageFileDirectory_v1.__init__c                 C  r   rU   )r  r   r2   r2   r6   r   ;  r   zImageFileDirectory_v1.<lambda>c                 C  r   rU   )r  r   r2   r2   r6   r   <  r   zdict[int, int]r   originalr   c                 C  s(   | |j d}|j|_|j|_|j|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`

        rY   )rQ   r  r   r   )clsr  r  r2   r2   r6   from_v2B  s
   zImageFileDirectory_v1.from_v2c                 C  s4   t | jd}t| j|_t| j|_t| j|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`

        rY   )r   rQ   r  r  r   r  )rw   r  r2   r2   r6   to_v2T  s
   zImageFileDirectory_v1.to_v2r  r   rT   c                 C  r  rU   )r  r  r  r2   r2   r6   r  e  r  z"ImageFileDirectory_v1.__contains__r_   c                 C  r  rU   )rN   r  r  r  r   r2   r2   r6   r  h  r  zImageFileDirectory_v1.__len__r9  c                 C  r  rU   )r:  r  r  r  r   r2   r2   r6   r;  k  r  zImageFileDirectory_v1.__iter__r   c                 C  s   dD ]	}|  ||| qd S N)FT)r  )rw   r  r   r   r2   r2   r6   r  n  s   z!ImageFileDirectory_v1.__setitem__c                 C  sn   || j vr&| j| }| j| }| j| \}}dD ]}| ||| ||| q| j | }t|ttfs5|f}|S r  )r  r  r   r   r  r   rW   rR   )rw   r  r   r  r   r  legacyr\   r2   r2   r6   r  r  s   



z!ImageFileDirectory_v1.__getitem__)rx   r	   r  r	   rS   r   )r  r   rS   r  )rS   r   r  r   r  r  r  )r   r   r   r   r   r   tagsZtagdatar  classmethodr  r  r  r  r;  r  r  __classcell__r2   r2   r  r6   r  $  s   
 




r  c                      s   e Zd ZdZdZdZ	d'd( fddZd)ddZed*ddZ	d+ddZ
d+ddZd*ddZd,ddZd- fddZd)dd Zd)d!d"Zd-d#d$Zd)d%d&Z  ZS ).TiffImageFileZTIFFz
Adobe TIFFFNrr  StrOrBytesPath | IO[bytes]filenamestr | bytes | NonerS   r   c                   s   |  	 |  	 t  || d S rU   )r  r   )rw   rr  r  r  r2   r6   r     s
   zTiffImageFile.__init__c                 C  s   | j dusJ | j d}|d dkr|| j d7 }t|| _| jj | _| _d| _| j | _g | _	d| _
td td| j tdt| | d	 dS )
z#Open the first image in a TIFF fileNr-   r%   r   ra   z*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )rr  ru  r   tag_v2r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesr  r  r   _seekr  r2   r2   r6   _open  s   

zTiffImageFile._openr_   c                 C  sj   | j }|d u r+|  }| t| j | j d u r&| |  d  | j d u s| | | j d us2J | j S )Nr   )r  r  r  rN   r  r  )rw   Zcurrent_n_framescurrentr2   r2   r6   n_frames  s   


zTiffImageFile.n_framesframec                 C  sV   |  |sdS | | | jdur'| jj| jks"| jj| jks"| jr)d| _dS dS dS )z%Select a given frame as current imageN)Z_seek_checkr  _imimr   
_tile_sizemodereadonly)rw   r  r2   r2   r6   r    s   



zTiffImageFile.seekc                 C  s  t | jtr
| jj| j| _t| j|kr| jsd}t|t	
d|| j| j| j  | jdkr7d}t|| j| j | j| j t	
d| j  | j| j | jj| jv r`d| _n| jj| _| jdkro|d | _t| jdkr|| jdk| _|  jd7  _t| j|ks| j| j|  | j| j t| jv r| jt }t |trt|dkr|d }|| jd< n	d| jv r| jd= |   t| j | _| _|| _|   d S )	Nzno more images in TIFF filez9Seeking to frame %s, on frame %s, __next %s, location: %sl            zUnable to seek to framezLoading tags, location: %sr   r   xmp)r   r  r   exrr  rN   r  r  EOFErrorr  r  r  r  r0  r  r  r  r  r   r  is_animatedXMPrW   r$  Z_reload_exifr  r  r  r  _setup)rw   r  r   r  r2   r2   r6   r    sV   






zTiffImageFile._seekc                 C  r   )zReturn the current frame number)r  r   r2   r2   r6   r    r   zTiffImageFile.telldict[int, dict[str, bytes]]c                 C  s   i }| j tjj}|rt|drtt|dkrtt|dd }t	|d d d d }zt
|d| d|  }W n tjyE   Y |S w |d| d| |  }d|i||< |t	d| | d d d	 }|drtt|dks|S )
a5  
        Returns a dictionary of Photoshop "Image Resource Blocks".
        The keys are the image resource ID. For more information, see
        https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727

        :returns: Photoshop "Image Resource Blocks" in a dictionary.
        s   8BIMr;   r'   r)   r   r%   ro  r   N)r  r  r   BaseZImageResourcesrV   rN   i16mathceili32r   error)rw   blocksr\   idnr   r   r2   r2   r6   get_photoshop_blocks  s"   "z"TiffImageFile.get_photoshop_blocksImage.core.PixelAccess | Nonec                   s   | j r
| jr
|  S t  S rU   )tileuse_load_libtiff_load_libtiffr  r  r   r  r2   r6   r    s   
zTiffImageFile.loadc                 C  s:   | j d u rt| j tj| j| j| _tj	|  d S rU   )
r  r   Z_decompression_bomb_checkr  corenewr  r  r   load_preparer   r2   r2   r6   r    s   
zTiffImageFile.load_preparec                 C  sd   | j sd| _|  }tjD ]}||vrq|| qtj| dd tj	j
| jv r0| jtj	j
= d S d S )NT)Zin_place)r  !_close_exclusive_fp_after_loadingZgetexifr   TAGS_V2_GROUPSget_ifdr   Zexif_transposer   r  Orientationr  )rw   exifkeyr2   r2   r6   load_end"  s   
zTiffImageFile.load_endc              
   C  s  t j |  |   t| jdksd}t|| jd d }| jd d }| jdus,J zt| jdo7| j }t| jdrC| j	  W n tyO   d}Y nw |ret
|tsYJ t|}||d	< t|}t | jd
|| j}z	|| j| W n ty } zd}t||d}~ww | jo| j }t| jdrtd || j \}	}
n<|rtd |s| jd t|dtj}|d\}	}
t||tj ntd | jd || j \}	}
g | _d| _|    |r| j!  d| _|
dk rd|
 }t|t j | S )zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r&   NfilenoflushFr%   libtiffzCouldn't set the imagegetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.s   fpfpz+don't have fileno or getvalue. just readingzdecoder error )"r   r  r  rN   r  rv  rr  r   r  r  r   rW   r  Z_getdecoderr  Zdecoderconfigsetimager  r0  Z_exclusive_fpr  r  r  rM  r  r  oslseekSEEK_CURSEEK_SETru  r  r  close)rw   r   Zextentsrx   rr  Z	args_listdecodereZclose_self_fpr  errposr2   r2   r6   r  3  sj   








zTiffImageFile._load_libtiffc                  C  s  d| j v rd}t|t| j td | _| j td| _| j td}| jdkr+d}| j t	d}t
d t
d| j t
d	| t
d
| j t
d| t
d| j t z| j t }| j t }W n tyz } zd}t||d}~ww t|trt|tsd}t|||f| _| j tjj}|dv r||f| _n||f| _t
d| j | j td}t|dkrt|t|kr|d f}| j td}	| j td}
| j t | jdkr|dv rdnd}|dv rd}n	|dkrd}nd}| jdkr|
rt|
dkr|	dt|
  }	|t|
8 }d}
|t|
7 }t|	}|t!kr4t
"d| d}t#|||k r@|	d| }	n||krN|dkrN|	| }	t|	|kr[d}t#|| j j$||||	|
f}t
d| z	t%| \| _&}W n ty } zt
d d}t#||d}~ww t
d | t
d!| j' | j| j(d"< | j t)d}| j t*d}|r|r| j t+}|dkr||f| j(d#< n,|dkr|d$ |d$ f| j(d#< n|du r||f| j(d#< ||f| j(d%< n||f| j(d%< d } }}g | _,t-p| jd&k| _.| j.rn|dkr*|dd d |dd  }t
d| t%| \| _&}|dkr>| jd'kr>| jdkr>d(}n|d)krFd*}n|/d+rT|dd, d- }|| jd.| j j0f}| j,1t23d/dd||fd| nt4| j v szt5| j v r0t4| j v r| j t4 }| j t6|}|}n%| j t5 }| j t7}| j t8}t|trt|tsd0}t||}||kr||kr| jdkr|d,d }|D ]b}|| |kr|t9|	 d1 }nd}|}| jdkr|| }|| }|t|df}| j,1t23| j||t|| |t|| |f|| ||7 }||kr-d|| }}||kr-d}|d7 }qnt
d2 d}t#|t:| j v rI| j t: | j(d3< | j'd4v red5d6 | j t; D }t<=d7d8>|| _?dS dS )9z-Setup this image object based on current tagsi  z+Windows Media Photo files not yet supportedr   r   r*   r)   z*** Summary ***z- compression: %sz - photometric_interpretation: %sz- planar_configuration: %sz- fill_order: %sz- YCbCr subsampling: %szMissing dimensionsNzInvalid dimensions)r(   r)   r+   r-   z
- size: %sr8   r2   )r%   r)   r&   )r%   r)   r-   r(   r'   r%   z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelzunknown data organizationzformat key: %sz- unsupported formatzunknown pixel modez- raw mode: %sz- pil mode: %scompressiondpigRQ@
resolutionr$   r,   rE   r<   I;16N)z;16Bz;16Lra   NFr  zInvalid tile dimensionsr-   z- unsupported data organizationicc_profilerJ   rK   c                 S  s   g | ]}t |d  qS r!   r   )r3   r@  r2   r2   r6   r"    s    z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr   )@r  rv  COMPRESSION_INFOr  COMPRESSION_compressionPLANAR_CONFIGURATIONZ_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERr  r  YCBCRSUBSAMPLING
IMAGEWIDTHIMAGELENGTHr  	TypeErrorr   r_   r0  r  r   r  r  _sizer   SAMPLEFORMATrN   rr   rq   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELr  r   rQ   	OPEN_INFO_moder  r$  X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  rL  r  r  r   _Tiler  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr   r$   r   palette) rw   r   photoZ	fillorderZxsizeZysizer  ZorientationZsample_formatZ	bps_tupleZextra_tupleZsamples_per_pixelZ	bps_countZbps_actual_countr  rawmodeZxresZyresZresunitxylayerrT  offsetsrA  wZ	tilewidthr  strideZtile_rawmoderx   r"  r2   r2   r6   r    sD  







 









"

 


zTiffImageFile._setuprU   )rr  r  r  r  rS   r   r  r   )r  r_   rS   r   )rS   r  )rS   r  )r   r   r   formatformat_descriptionr  r   r  r   r  r  r  r  r  r  r  r  r  r  r  r2   r2   r  r6   r    s$    



1



ar  r9   r:   rD   rJ   rK   r?   rC   r<   I;16LrA   rB   rE   rH   rF   rL   YCbCrrM   r>   r  Image.Imagerr  rs  r  str | bytesc           6      C  s	  zt | j \}}}}}}W n ty% }	 zd| j d}
t|
|	d }	~	ww | j}| j}t|d}|dr9d|_z|d }W n tyU   | j	d}t
|trSd }Y nw |d u r]d}n|dkrdd	}n|d
krjd}tpo|dk}d|t< | jd |t< | jd |t< d|v r|d }nd|v r|d }t
|trt }|| |}ni }tdt| t
|tr| }|D ]/}t
|tjr|tjv r||||< n||||< z
|j| |j|< W q ty   Y qw i }t| dr| j  }i |t!| di }|tdkr t"|v r t#|v r|t#  t$|t" 8  < |t"= t%t&fD ]}||v r.||= q$t| drot't(t)t*t+t,fD ]0}|| j-v rm|t*kr]| j-j| tj.tj/fvr]||= q>| j-| ||< | j-j| |j|< q>|d| j	d}|r||t0< t1dft(dft)dft(dft)dft'dft2dft3dft4dft5dff
D ]\}}||v r|| ||< q|d}|rd|t'< |d |t(< |d |t)< |dkr||t6< t$|dkrt$||t#< |d ur||t"< |dkr||t&< t7|vr||t7< nK| jd v rF|t7 dkrF| jd!krA| 8 }| }|d ur@t9|j:D ]}t9|j;D ]}|||f d"kr4dnd"|||f< q'q |} nt<=| } | jd#v r| j>?d$d%}g }t$|d& }t9d&D ]} |d'd( |||  || d   D 7 }|dgd)|  7 }q_||t@< |t |t }!}"t$||!|d  d* d+  }#tA|vr|r|d,tB}$|#dkrdntC|$|# |"}%|d	krtC|%d* d+ d+ |"}%n|"}%|%dkrd}%|%|tA< |#dkrdn|#|tA  }&|"|tA  d |tA  }'|&d-krtjD|jtE< |&f|'d  |#|" |&|'d   f |tE< tFt9d|&|' |&|tG< tH|d|tI< | jd.kr:tJd/tKd0iL D ]\}}(|M||( q.tNtOtPtQg})|rd1|v rq|d1 }*t
|*tr\|*dk s\|*d2krbd3}
tR|
|d	krmd4}
tR|
|*|tS< td5 td6tT|L  d}+t|d7rz|Ud |V }+W n tWjXy   Y nw i },|)tYtKtEtGtZt[g7 })t6|d i}-t\]|L |L D ]z\}}.|tj^vr|tjv rtj_|,|< n5||jv r|j| |,|< n't
|.tt`tatfst
|.tFrtbd8d9 |.D rtc|jd}/|/r|/|,|< ||-vr4||)vr4t
|.tar"|.ed:d;d< |-|< qt
|.tfr0t`|.|-|< q|.|-|< qt&|-v rLt$|-t& dkrL|-t& d |-t&< td=tT|-L  | jd>v r^d?}t|-L }0|0g  |||+||0|,f}1th| jd@|1|}2|2i| j>dA| j  	 |2etjjkdd  \}3}4|+s|l|4 |3rnq|3dk rdB|3 dC}
t|
n"|)D ]}||= q|m|}5tjn| |tjoddA| j |5||#dfg dD|v rtp| dD| d S d S )ENzcannot write mode z as TIFFrY   Zbig_tiffTr  r$   r*   r,   r/   r.   r   r   Ztiffinfor  zTiffinfo Keys: %sr  r  r%   r   descriptionr  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr  r8   )r9   r:   r9   r    r  rE   r  r&   c                 S  s   g | ]}|d  qS r  r2   r  r2   r2   r6   r"  G  r  z_save.<locals>.<listcomp>r!   r+   r-   Z
strip_sizer   r.  )r   r   )r   r       r    r4  r    qualityd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr  c                 s  s     | ]}t |tttfV  qd S rU   )r   r_   rk   rc   r  r2   r2   r6   rO     s    z_save.<locals>.<genexpr>r   r   rK  zConverted items: %s)r<   r>   r-  r  r  rI   zencoder error z when writing image fileZ_debug_multipage)q	SAVE_INFOr  r  rv  encoderinfoencoderconfigr   r  r   r$  r   r_   WRITE_LIBTIFFr  r   r  r  rR   r   ZExifr  r  r  r  r  r  r   r  r  r   r  r   r  r{   r  r  rN   EXIFIFDr  r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKr  r  r.  r&  r   IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  r  copyr  heightwidthr   invertr  Z
getpaletter!  r  
STRIP_SIZErq   r*  STRIPBYTECOUNTSrW   r  COMPRESSION_INFO_REVr  r
  REFERENCEBLACKWHITEr  
setdefaultr  r  r  TILEBYTECOUNTSr0  JPEGQUALITYr  r  r  ioUnsupportedOperationOSUBFILETYPETRANSFERFUNCTIONSUBIFD	itertoolschainZLIBTIFF_COREr  rk   rv   r'  r  r%  r!  rc   sortZ_getencoderr  r   ZMAXBLOCKr  r  _saver  setattr)6r  rr  r  r$  rQ   r#  r+  bitsextrar  r   r8  r9  r  r  r  r$  r  r  Z
legacy_ifdZsupplied_tagsr  Ziccr   r  Zinverted_imZpxr&  r%  ZlutZcolormapcolorsrm   r)  rA  r*  Zim_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imagedefault_valueZ	blocklistr5  r  typesZattsr   r%  r  rT  encodererrcoder   r  r2   r2   r6   rV    s  




















&
&






 








rV  c                   @  sH  e Zd Zg dZh dZdVdWd
dZdXddZdXddZdXddZdYddZ	dZddZ
d[ddZejfd\ddZdXdd Zd]d#d$ZdXd%d&Zd^d)d*Zd_d,d-Zd`d.d/Zd[d0d1Zd[d2d3Zedad7d8Z	9dbdcd<d=Zddd>d?Zddd@dAZdddBdCZdedDdEZdddFdGZdddHdIZdXdJdKZ dXdLdMZ!dfdOdPZ"	dgdhdSdTZ#dUS )iAppendingTiffWriter)r   r   r   r%   r'   r-   r   r   r%   r'   r-   r'   r-   r'   r%   r'   r-   >   i   r#   i  i  i	  r"   Ffnr  r  rT   rS   r   c                 C  s~   |  t |r(|| _d| _zt||rdnd| _W n ty'   t|d| _Y nw ttt || _d| _| j	 | _
|   d S )NTzw+bzr+bF)r   r   close_fpopenr   rv  r
   r   rR   r  	beginningsetup)rw   r`  r  r2   r2   r6   r     s   zAppendingTiffWriter.__init__c                 C  s   | j | jtj d | _d| _| j d | _}d|v | _	|s$d| _
d S d| _
|tvr1d}t|| |tr:dnd | j	rH| j dtj |   |   d S )	Nr   r'      +TFzInvalid TIFF file headerr   r   )r   r  rc  r  r  whereToWriteNewIFDOffsetoffsetOfNewPageru  IIMMr   isFirstrX   RuntimeError	setEndianrV   r   r  skipIFDsgoToEnd)rw   iimmr   r2   r2   r6   rd    s"   
zAppendingTiffWriter.setupc                 C  s   | j rd S | j| j | jd}|sd S || jkr!d}t|| jr,| jdtj	 | 
| jr3dnd}|| j7 }| jd usBJ | j| j | || jrQdnd | j| |   d S )Nr'   z1IIMM of new page doesn't match IIMM of first pager-   )ri  r   r  rg  ru  rh  rj  r   r  r  _readrf  _writefixIFD)rw   rn  r   
ifd_offsetr2   r2   r6   finalize*  s$   

zAppendingTiffWriter.finalizec                 C  s   |    |   d S rU   )rs  rd  r   r2   r2   r6   newFrameD  s   zAppendingTiffWriter.newFramec                 C  s   | S rU   r2   r   r2   r2   r6   	__enter__I  s   zAppendingTiffWriter.__enter__rx   r   c                 G  s   | j r	|   d S d S rU   )ra  r  r}   r2   r2   r6   __exit__L  s   zAppendingTiffWriter.__exit__r_   c                 C  s   | j  | j S rU   )r   r  rg  r   r2   r2   r6   r  P  r   zAppendingTiffWriter.tellr  whencec                 C  s*   |t jkr
|| j7 }| j|| |  S )z
        :param offset: Distance to seek.
        :param whence: Whether the distance is relative to the start,
                       end or current position.
        :returns: The resulting position, relative to the start.
        )r  r  rg  r   r  r  )rw   r  rw  r2   r2   r6   r  S  s   

zAppendingTiffWriter.seekc                 C  s^   | j dtj | j  }d|d  }d|  k rdk r'n n| j t| | j  | _d S )Nr   r=   )r   r  r  SEEK_ENDr  r  rR   rg  )rw   r  Z	pad_bytesr2   r2   r6   rm  `  s   
zAppendingTiffWriter.goToEndendianrv   c                 C  sB   || _ | j  d| _| j  d| _| j  d| jrdnd | _d S )Nr:   r?  r  r   )ry  ZlongFmtZshortFmtr   	tagFormat)rw   ry  r2   r2   r6   rk  j  s    zAppendingTiffWriter.setEndianc                 C  s|   	 |  | jrdnd}|dkr| j | jrdnd | _d S | j| |  | jr+dnd}| j|| jr7dnd tj q)NTr-   r'   r   r%   rz  r;   )ro  r   r   r  rf  r  r  r  )rw   rr  num_tagsr2   r2   r6   rl  p  s   zAppendingTiffWriter.skipIFDsr   r   c                C  s   | j |S rU   )r   r  rI  r2   r2   r6   r  }  r	  zAppendingTiffWriter.write
field_sizec                 C  s.   z	dddd| W S  t y   d}t|w )Nr?  r:   r   )r%   r'   r-   zoffset is not supported)r  rj  )rw   r|  r   r2   r2   r6   _fmt  s   zAppendingTiffWriter._fmtc                 C  s&   t | j| | | j|\}|S rU   )r   r<  ry  r}  r   ru  )rw   r|  r   r2   r2   r6   ro    s   zAppendingTiffWriter._readc                 C  
   |  dS Nr%   ro  r   r2   r2   r6   	readShort  r   zAppendingTiffWriter.readShortc                 C  r~  Nr'   r  r   r2   r2   r6   readLong  r   zAppendingTiffWriter.readLongbytes_writtenr   expectedc                 C  s0   | d ur| |krd|  d| }t |d S d S )Nzwrote only z bytes but wanted )rj  )r  r  r   r2   r2   r6   _verify_bytes_written  s   z)AppendingTiffWriter._verify_bytes_writtenr   r   new_field_sizec                 C  sJ   | j | tj |s|}| j t| j| | |}| 	|| d S rU   )
r   r  r  r  r  r   r>  ry  r}  r  )rw   r   r|  r  r  r2   r2   r6   _rewriteLast  s   z AppendingTiffWriter._rewriteLastc                 C  s   |  |dd d S )Nr%   r'   r  rP  r2   r2   r6   rewriteLastShortToLong  r=  z*AppendingTiffWriter.rewriteLastShortToLongc                 C     |  |dS r  r  rP  r2   r2   r6   rewriteLastShort  r	  z$AppendingTiffWriter.rewriteLastShortc                 C  r  r  r  rP  r2   r2   r6   rewriteLastLong  r	  z#AppendingTiffWriter.rewriteLastLongc                 C  s0   | j t| j| | |}| || d S rU   )r   r  r   r>  ry  r}  r  )rw   r   r|  r  r2   r2   r6   rp    s   zAppendingTiffWriter._writec                 C     |  |d d S r  rp  rP  r2   r2   r6   
writeShort  r   zAppendingTiffWriter.writeShortc                 C  r  r  r  rP  r2   r2   r6   	writeLong  r   zAppendingTiffWriter.writeLongc                 C  s    |    | jr| j  d S d S rU   )rs  ra  r   r  r   r2   r2   r6   r    s   zAppendingTiffWriter.closec              
   C  s*  |  | jrdnd}t|D ]}t| j| j| jrdnd\}}}| j| }|| }| jr1dnd}||k}	|	sG|  || j	 }
| 
|
| || jv r| j }tdt|j|t|d||| |	ru| || | j||  q| j|
 | || | j| q|	r| j|tj qd S )Nr-   r%   r;   r'   z;fixIFD: %s (%d) - type: %s (%d) - type size: %d - count: %dr|  )ro  r   r  r   r<  rz  r   ru  
fieldSizesrg  r  Tagsr  r  r  r   r  r   r   r  _fixOffsetsr  r  r  )rw   r{  rm   r  Z
field_typer  r|  Z
total_sizer  is_localr  Zcur_posr2   r2   r6   rq    sB   






zAppendingTiffWriter.fixIFDr  c                 C  s   t |D ]^}| |}|| j7 }d}| jr |dv r |dkr d}n
|dkr*|dkr*d}|r\|dkr6d	}t|| ||| | d d }| j|tj	 | 
| | jd| tj	 q| || qd S )
Nr   )r%   r'   l        r-   r%   r   r'   r   znot implemented)r  ro  rg  r   rj  r  r   r  r  r  r  )rw   r  r|  rm   r  r  r   rewindr2   r2   r6   r    s&   


zAppendingTiffWriter._fixOffsetsisShortisLongc                 C  s$   |rd}n|r
d}nd}|  ||S )Nr%   r'   r   )r  )rw   r  r  r  r|  r2   r2   r6   
fixOffsets	  s   zAppendingTiffWriter.fixOffsetsN)F)r`  r  r  rT   rS   r   r  )rS   r_  )rx   r   rS   r   r   )r  r_   rw  r_   rS   r_   )ry  rv   rS   r   )r   r   rS   r_   )r|  r_   rS   rv   )r|  r_   rS   r_   )r  r   r  r_   rS   r   rG   )r   r_   r|  r_   r  r_   rS   r   )r   r_   rS   r   )r   r_   r|  r_   rS   r   )r  r_   r|  r_   rS   r   )FF)r  r_   r  rT   r  rT   rS   r   )$r   r   r   r  r  r   rd  rs  rt  ru  rv  r  rN  r  r  rm  rk  rl  r  r}  ro  r  r  staticmethodr  r  r  r  r  rp  r  r  r  rq  r  r  r2   r2   r2   r6   r_    sD    	























)r_  c           
   	   C  s   t | jdg }t| ds|st| ||S |  }z\t|@}| g| D ]2}|| }t|ds4d|_t	|dd}t
|D ]}	||	 |  t||| |  q>||_q%W d    n1 sbw   Y  W | | d S W | | d S | | w )Nappend_imagesr  r9  r2   r   )r  r8  r  r   rV  r  r_  Z_attach_default_encoderinfor9  r{   r  r  r  rt  )
r  rr  r  r  Zcur_idxtfZimsr8  Znfrr   r2   r2   r6   	_save_all	  s,   




r  z.tifz.tiffz
image/tiff)rQ   rR   rS   rT   )r\   r]   r^   r_   rS   r`   )r\   rc   r^   r_   rh   r_   rS   r`   )ru   rv   rS   r	   )r   r_   r   r_   rS   r   )r   r_   rS   r   )r   r   rS   r   )r  r/  rr  rs  r  r0  rS   r   )
__future__r   rN  rS  loggingr  r  r   r1  collections.abcr   r   	fractionsr   numbersr   r   typingr   r	   r
    r   r   r   r   r   r   _binaryr   r  r   r  r   Z_utilr   r   r   r   r   r   Z_typingr   r   r   	getLoggerr   r  r  r:  rG  r   r   rP  r  r  r  r  r  r	  r>  r  r  r  rH  r  r  r  r  rQ  r?  r@  rA  Z	PREDICTORr!  r  r  r  rL  rR  r  r  Z
JPEGTABLESr
  rJ  rB  r<  r=  r   r;  r  rM  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr  r  rI  r  rr   r  rX   rZ   rg   rt   r   r   r   rc   rR   rT   r   r   r   r   r_   Z
_IFDv2Baser   r   r   r   rW  r  ZImageFileDirectoryr  r7  rV  BytesIOr_  r  Zregister_openr+  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer2   r2   r2   r6   <module>   sX  ( 
	
	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvyz{|
	     \    	
  <  .