a
    AgE                    @  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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& ddl'm(Z( ddl)m*Z* ddlm+Z+ erddl'm,Z,m-Z- e.e/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.ZOd/ZPd0ZQd1ZRd2ZSd3ZTd4ZUd5ZVd6ZWd7ZXd8ZYd9ZZd:Z[d;Z\d<Z]d=Z^d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOZ_dPdQ e_` D Zae4d dRddRdSfdTe5d dRddRdSfdTe4d dRdUdRdSfdVe5d dRdUdRdSfdVe4ddRddRdSfdWe5ddRddRdSfdWe4ddRdUdRdSfdXe5ddRdUdRdSfdXe4d dRddYdSfdZe5d dRddYdSfdZe4d dRdUdYdSfd[e5d dRdUdYdSfd[e4ddRddYdSfd\e5ddRddYdSfd\e4ddRdUdYdSfd]e5ddRdUdYdSfd]e4d dRdd^dSfd_e5d dRdd^dSfd_e4d dRdUd^dSfd`e5d dRdUd^dSfd`e4ddRdd^dSfdae5ddRdd^dSfdae4ddRdUd^dSfdbe5ddRdUd^dSfdbe4d dRddcdSfdde5d dRddcdSfdde4d dRdUdcdSfdee5d dRdUdcdSfdee4ddRddcdSfdfe5ddRddcdSfdfe4ddYddcdSfdfe5ddYddcdSfdfe4ddRdUdcdSfdge5ddRdUdcdSfdge4ddRddhdSfdie4d dRddjdSfdke4ddRddjdSfdke5ddRddjdSfdle4ddRdUdjdSfdme4ddYddjdSfdne5ddYddjdSfdoe4d dpddqdSfdre5d dpddqdSfdse4ddRddqdSfdte4ddYddqdSfdue5ddYddqdSfdve4ddpddqdSfdre5ddpddqdSfdse4ddRddwdYfdxe5ddRddwdYfdxe4dUdRddydSfdze5dUdRddydSfdze4dUdRdUdydSfd{e5dUdRdUdydSfd{e4dUdRdd|dSfd}e5dUdRdd|dSfd}e4dUdRdd|d~fde5dUdRdd|d~fde4dUdRdddfde5dUdRdddfde4dUdRdddfde5dUdRdddfde4dUdRdd|dRfde5dUdRdd|dRfde4dUdRdddfde5dUdRdddfde4dUdRdddfde5dUdRdddfde4dUdRdd|dYfd}e5dUdRdd|dYfd}e4dUdRdddfde5dUdRdddfde4dUdRdddfde5dUdRdddfde4dUdRdd|dfd}e5dUdRdd|dfd}e4dUdRdddSfde5dUdRdddSfde4dUdRdddSfde5dUdRdddSfde4dUdRddd~fde5dUdRddd~fde4dUdRdddRfde5dUdRdddRfde4dUdRdddYfde5dUdRdddYfde4ddRddRdSfde5ddRddRdSfde4ddRdUdRdSfde5ddRdUdRdSfde4ddRddYdSfde5ddRddYdSfde4ddRdUdYdSfde5ddRdUdYdSfde4ddRdd^dSfde5ddRdd^dSfde4ddRdUd^dSfde5ddRdUd^dSfde4ddRddcdSfde5ddRddcdSfde4ddRddwd~fde4ddRddwdYfde5ddRddwdYfde4ddRdUdcdSfde5ddRdUdcdSfde4ddRdd|dSfde5ddRdd|dSfde4ddRddd~fde5ddRddd~fde4ddRdddfde5ddRdddfde4ddRdddSfde5ddRdddSfde4ddRddcdSfdfe5ddRddcdSfdfe4ddRddydSfde5ddRddydSfde4ddRddydSfde5ddRddydSfdiwZbecdd ebD Zdg dZeefejgdd	se&dd dddddZhddddddZidddddddÄZji Zki ZldddƜddȄZmG dd deZnedeoepgef Zqdddd̜dd΄ZrdddМdd҄Zsddd՜ddׄZte
rteeuef ZvneZvG ddʄ devZwekew_kelew_le+` D ]F\ZxZyeyzddڡZye{ewdey ekex d  e{ewdey elex  
q[k[l[x[yG ddބ dewZ|e|Z}G dd dejZ~de4dddRdfde4dddcdfde4dddwdUfde4dddcdfde4dddwdUfde4ddUdqdfde4dddjdfde4ddUdjdfde4dddqdfde4dUddydfde4dUdd|d fde4dUdd|dUfde4ddd|dfde4dddydfde4dddydfde5ddUdqdfde5dddjdfde5ddUdjdfde5dddqdfdZdddddddZG dd dejZdddddddZee~je~eh ee~je ee~je ee~jdd g ee~jd dS (      )annotationsN)IteratorMutableMapping)Fraction)NumberRational)IOTYPE_CHECKINGAnyCallableNoReturncast   )ExifTagsImage	ImageFileImageOpsImagePaletteTiffTags)i16be)i32beo8)	deprecate)StrOrBytesPath)is_pathTYPES)BufferIntegralLikeF   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  rawZ
tiff_ccittZgroup3Zgroup4Ztiff_lzw	tiff_jpegjpegtiff_adobe_deflateZtiff_raw_16ZpackbitsZtiff_thunderscantiff_deflateZtiff_sgilogZtiff_sgilog24lzmaZzstdZwebp)r                        i  i  i)  i  it  iu  im  iP  iQ  c                 C  s   i | ]\}}||qS  r2   ).0kvr2   r2   R/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/PIL/TiffImagePlugin.py
<dictcomp>       r7   r   r2   )1z1;Ir+   )r:   z1;IR)r:   r:   )r:   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)r1   )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)II;16S)r@   I;16BS)r,   )    )FF;32F)rD   F;32BF)r@   zI;32N)r@   I;32S)r@   I;32BS)r1   r1   )LArI   )r1   r1   r1   )RGBrJ   )rJ   zRGB;R)r1   r1   r1   r1   )RGBArK   )r   )rJ   RGBX)r1   r1   r1   r1   r1   r   r   )rJ   ZRGBXX)r1   r1   r1   r1   r1   r1   )r   r   r   )rJ   ZRGBXXX)rK   ZRGBa)r   r   )rK   ZRGBaX)r   r   r   )rK   ZRGBaXX)r+   r   )rK   ZRGBAX)r+   r   r   )rK   ZRGBAXX)i  )r>   r>   r>   )rJ   zRGB;16L)rJ   zRGB;16B)r>   r>   r>   r>   )rK   zRGBA;16L)rK   zRGBA;16B)rJ   zRGBX;16L)rJ   zRGBX;16B)rK   zRGBa;16L)rK   zRGBa;16Br,   )PzP;1)rN   zP;1R)rN   zP;2)rN   zP;2R)rN   zP;4)rN   zP;4R)rN   rN   )rN   ZPX)PArO   )rN   zP;Rr.   )CMYKrP   )rP   ZCMYKX)rP   ZCMYKXX)rP   zCMYK;16L)rP   zCMYK;16Br/   r1   )LABrQ   c                 c  s   | ]}t |d  V  qdS )r-   N)len)r3   Zkey_tpr2   r2   r6   	<genexpr>  r8   rS   )   MM *   II* s   MM* s   II *s   MM +s   II+ libtiff_support_custom_tagsTz*Support for LibTIFF earlier than version 4r<   bytesbool)prefixreturnc                 C  s   | d d t v S Nr-   )PREFIXESrY   r2   r2   r6   _accept"  s    r^   float | Fraction | IFDRationalintz!tuple[IntegralLike, IntegralLike])valmax_valrZ   c                 C  s<   t | dk}t|rd|  n| |}|r8|d d d S |S )Nr   )absIFDRationallimit_rational)ra   rb   invn_dr2   r2   r6   _limit_rational&  s    ri   re   )ra   rb   min_valrZ   c                 C  sp   t | }|j|jf}tdd |D |k r8t| t|}tdd |D }t||krlt|d |d  |}|S )Nc                 s  s   | ]}t |V  qd S Nfloatr3   ir2   r2   r6   rS   4  r8   z)_limit_signed_rational.<locals>.<genexpr>c                 s  s   | ]}t |V  qd S rk   rl   rn   r2   r2   r6   rS   7  r8   r   r   )r   	numeratordenominatorminri   rd   tuplemax)ra   rb   rj   fracrh   Z	n_d_floatr2   r2   r6   _limit_signed_rational.  s    rv   strr
   )oprZ   c                   s   dddd fdd}|S )Nre   ztuple[float, ...]zbool | float | Fraction)selfargsrZ   c                   s   t | j | S rk   )getattr_valry   rz   rx   r2   r6   delegateF  s    z_delegate.<locals>.delegater2   )rx   r   r2   r~   r6   	_delegateE  s    r   c                   @  s  e Zd ZdZdZd@dddddd	Zed
dddZeddddZdddddZ	ddddZ
ddddZdddddZdddd Zddd!d"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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*e+d>red>Z,d?S )Are   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   r_   r`   None)valuerq   rZ   c                 C  s   |  t |tr*|j| _|j| _|j| _dS t |trF|j| _|j| _ntrXt	t
|| _n|| _|| _|dkrxtd| _n@|dkrt|| _n,t||krtt||| _n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   )
isinstancere   rp   r   rq   r   r|   r   r	   r   r   rm   r`   )ry   r   rq   r2   r2   r6   __init__\  s(    


zIFDRational.__init__r   rZ   c                 C  s   | j S rk   )r   ry   r2   r2   r6   rp   ~  s    zIFDRational.numeratorc                 C  s   | j S rk   )r   r   r2   r2   r6   rq     s    zIFDRational.denominatorztuple[IntegralLike, int])max_denominatorrZ   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   )rq   rp   r   r|   r   Zlimit_denominator)ry   r   fr2   r2   r6   rf     s
    
zIFDRational.limit_rationalrw   c                 C  s   t t| jS rk   )rw   rm   r|   r   r2   r2   r6   __repr__  s    zIFDRational.__repr__c                 C  s
   | j  S rk   )r|   __hash__r   r2   r2   r6   r     s    zIFDRational.__hash__objectrX   )otherrZ   c                 C  s0   | j }t|tr|j }t|tr(t|}||kS rk   )r|   r   re   rm   )ry   r   ra   r2   r2   r6   __eq__  s    

zIFDRational.__eq__z%list[float | Fraction | IntegralLike]c                 C  s   | j | j| jgS rk   )r|   r   r   r   r2   r2   r6   __getstate__  s    zIFDRational.__getstate__)staterZ   c                 C  s^   t | d |\}}}t|ttfs(J || _tr@tt|| _	n|| _	t|t
sTJ || _d S Nr   )re   r   r   rm   r   r|   r	   r   r   r   r`   r   )ry   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__N)r   )-__name__
__module____qualname____doc__	__slots__r   propertyrp   rq   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   hasattrr   r   r2   r2   r2   r6   re   N  sT    "ImageFileDirectory_v2z$Callable[[_LoaderFunc], _LoaderFunc])idxsizerZ   c                   s   ddd fdd}|S )N_LoaderFuncfuncrZ   c                   sB   ddl m} | jdr2| jdd  dd| < | ft < | S )Nr   r   load_r.   _ )r   r   r   
startswithreplace_load_dispatch)r   r   r   r   r2   r6   	decorator  s
    z#_register_loader.<locals>.decoratorr2   )r   r   r   r2   r   r6   _register_loader  s    r   z2Callable[[Callable[..., Any]], Callable[..., Any]])r   rZ   c                   s   ddd fdd}|S )NzCallable[..., Any]r   c                   s   | t  < | S rk   )_write_dispatch)r   r   r2   r6   r     s    z#_register_writer.<locals>.decoratorr2   )r   r   r2   r   r6   _register_writer  s    r   ztuple[int, str, str]r   )idx_fmt_namerZ   c                   sj   ddl m} | \} }|||< td  dddddd	 fd
d}|ft|<  fddt|< d S )Nr   r   =Tr   rW   rX   tuple[Any, ...])ry   data
legacy_apirZ   c                   s   |  t|    |S rk   )_unpackrR   ry   r   r   fmtr   r2   r6   basic_handler  s    z&_register_basic.<locals>.basic_handlerc                   s   d  fdd|D S )Nr8   c                 3  s   | ]}  |V  qd S rk   )_packr3   r   )r   ry   r2   r6   rS     r8   z4_register_basic.<locals>.<lambda>.<locals>.<genexpr>joinry   values)r   r   r6   <lambda>  s    z!_register_basic.<locals>.<lambda>)T)r   r   structcalcsizer   r   )r   r   r   namer   r2   r   r6   _register_basic  s    
 r   c                   @  s  e Zd ZU dZi Zded< i Zded< d~dd	d
ddddZedd Z	edd Z
eddddZejdddddZddddZddddZdddd Zd!dd"d#Zd!d$d%d&d'Zd(dd%d)d*Zd!d$dd+d,d-Zd!d$ddd.d/d0Zd!dd%d1d2Zd3dd4d5Zddd6d7d8d9Zdd$dd:d;d<Zeeeejd=d>fejd?d@fejdAdBfej dCdDfej!dEdFfej"dGdHfej#dIdJfej$d?d@fej%dKdLfg	 e&dMdMdddddOdPdQZ'e(dMdRddSdTdUZ)e&dVdMdddddOdWdXZ*e(dVdYdddZd[Z+e&d\d]dddd^dOd_d`Z,e(d\daddbdcddZ-e&dedMdddddOdfdgZ.e(dedRdddhdiZ/e&djd]dddd^dOdkdlZ0e(djdaddbdmdnZ1dod!ddpdqdrZ2doddsdtduZ3dvdw Z4dd!ddydzd{Z5dod!dsd|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*     NrW   zbytes | None
int | Noner   )ifhrY   grouprZ   c                 C  s   t |s dt| d}t||dur,|n
|dd | _| jtkrLd| _n| jtkr^d| _nd}t||d dk| _|| _i | _	| 
  | jr| 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+   Qr1   r   r;   r-   F)r^   reprSyntaxError_prefixMM_endianII_bigtiffr   tagtyperesetr   next_legacy_api)ry   r   rY   r   msgr2   r2   r6   r   G  s&    

zImageFileDirectory_v2.__init__c                 C  s   | j S rk   )r   r   r2   r2   r6   r   n  r8   zImageFileDirectory_v2.<lambda>c                 C  s   | j S rk   )_offsetr   r2   r2   r6   r   o  r8   rX   r   c                 C  s   | j S rk   )r   r   r2   r2   r6   r   q  s    z ImageFileDirectory_v2.legacy_apir   r   rZ   c                 C  s   d}t |d S )Nz"Not allowing setting of legacy api)	Exception)ry   r   r   r2   r2   r6   r   u  s    c                 C  s(   i | _ i | _i | _i | _d | _d | _d S rk   )_tags_v1_tags_v2_tagdatar   _nextr   r   r2   r2   r6   r   z  s    zImageFileDirectory_v2.resetrw   c                 C  s   t t| S rk   )rw   dictr   r2   r2   r6   __str__  s    zImageFileDirectory_v2.__str__z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  s   t t| jt| jB S rk   )rR   setr   r   r   r2   r2   r6   __len__  s    zImageFileDirectory_v2.__len__r
   tagrZ   c                 C  sf   || j vr>| j| }| j| }| j| \}}|| || j| |< | j | }| jrbt|ttfsb|f}|S rk   )r   r   r   r   r   r   rs   rW   )ry   r  r   typr   handlerra   r2   r2   r6   __getitem__  s    



z!ImageFileDirectory_v2.__getitem__r   c                 C  s   || j v p|| jv S rk   )r   r   ry   r  r2   r2   r6   __contains__  s    z"ImageFileDirectory_v2.__contains__r  r   rZ   c                 C  s   |  ||| j d S rk   )_setitemr   )ry   r  r   r2   r2   r6   __setitem__  s    z!ImageFileDirectory_v2.__setitem__)r  r   r   rZ   c              
     s6  t ttf}t|| j t||r(|gn|}|| jvr jrN j| j|< ntj	| j|< t
dd |D r|D ]*}t|tsJ |dk rptj| j|<  qqptj| j|< n<t
dd |D rd}d}d}	|D ]h}t|tsJ |rd|  krdk sn d}|r(d|  k r"d	k s(n d}|	r|dk rd}	q|rNtj| j|< n4|rbtj| j|< n |	rvtj| j|< ntj| j|< ndt
d
d |D rtj| j|< nBt
dd |D rtj| j|< n t
dd |D rtj| j|< | j| tj	kr
dd |D }n | j| tjkr*dd |D }| j| tjkoDt|t}
|
sbt fdd|D }|rn| jn| j}|
s* jdks| j| tjks jd u r*t|dkr*|s*|r| j| tjtjfv r|f}z|\||< W n< ty&   td| dt| d |d ||< Y n0 n|||< d S )Nc                 s  s   | ]}t |tV  qd S rk   )r   re   r3   r5   r2   r2   r6   rS     r8   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>r   c                 s  s   | ]}t |tV  qd S rk   )r   r`   r  r2   r2   r6   rS     r8   Tr    Fi i   c                 s  s   | ]}t |tV  qd S rk   )r   rm   r  r2   r2   r6   rS     r8   c                 s  s   | ]}t |tV  qd S rk   )r   rw   r  r2   r2   r6   rS     r8   c                 s  s   | ]}t |tV  qd S rk   )r   rW   r  r2   r2   r6   rS     r8   c                 S  s&   g | ]}t |tr|d dn|qS )asciir   )r   rw   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`   rm   r  r2   r2   r6   r    r8   c                 3  s&   | ]}t |tr |n|V  qd S rk   )r   rw   Zcvt_enumr   infor2   r6   rS     s   r   zMetadata Warning, tag z had too many entries: z, expected 1)r   rW   rw   r   r   r   r   r   type	UNDEFINEDallre   ZSIGNED_RATIONALZRATIONALr`   SHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr   rs   r   r   lengthrR   
ValueErrorwarningswarn)ry   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 rk   )r   popr   r   r  r2   r2   r6   __delitem__  s    z!ImageFileDirectory_v2.__delitem__Iterator[int]c                 C  s   t t| jt| jB S rk   )iterr   r   r   r   r2   r2   r6   __iter__  s    zImageFileDirectory_v2.__iter__r   )r   r   rZ   c                 C  s   t | j| |S rk   )r   unpackr   )ry   r   r   r2   r2   r6   r   
  s    zImageFileDirectory_v2._unpack)r   r   rZ   c                 G  s   t j| j| g|R  S rk   )r   packr   )ry   r   r   r2   r2   r6   r     s    zImageFileDirectory_v2._packHr  r;   r   bzsigned bytehzsigned shortlzsigned longr   rm   ddoubler   Zlong8r   T)r   r   rZ   c                 C  s   |S rk   r2   r   r2   r2   r6   	load_byte!  s    zImageFileDirectory_v2.load_bytezbytes | int | IFDRationalr   rZ   c                 C  s*   t |trt|}t |tr&t|f}|S rk   )r   re   r`   rW   ry   r   r2   r2   r6   
write_byte%  s
    


z ImageFileDirectory_v2.write_byter+   c                 C  s"   | dr|d d }|ddS )N    rc   zlatin-1r   )endswithdecoder   r2   r2   r6   load_string-  s    
z!ImageFileDirectory_v2.load_stringzstr | bytes | intc                 C  s0   t |trt|}t |ts(|dd}|d S )Nr  r   r4  )r   r`   rw   rW   r  ry   r   r2   r2   r6   write_string3  s
    

z"ImageFileDirectory_v2.write_stringr.   r1   z)tuple[tuple[int, int] | IFDRational, ...]c                   s`   |  t|d  d|}ddddfdd t fdd	t|d d d
 |dd d
 D S )Nr-   r;   r`   tuple[int, int] | IFDRationalar+  rZ   c                   s    r| |fS t | |S rk   re   r<  r+  r   r2   r6   combineB  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3  s   | ]\}} ||V  qd S rk   r2   r3   numZdenomr@  r2   r6   rS   E  r8   z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r+   r   r   rR   rs   zipry   r   r   valsr2   r@  r   r6   load_rational<  s    z#ImageFileDirectory_v2.load_rationalre   )r   rZ   c                   s   d  fdd|D S )Nr8   c                 3  s&   | ]} j d gt|dR  V  qdS )Z2Ll    N)r   ri   r3   ru   r   r2   r6   rS   I  s   z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r   r   r2   r   r6   write_rationalG  s    z$ImageFileDirectory_v2.write_rationalr0   c                 C  s   |S rk   r2   r   r2   r2   r6   load_undefinedM  s    z$ImageFileDirectory_v2.load_undefinedc                 C  s0   t |trt|}t |tr,t|dd}|S )Nr  r   )r   re   r`   rw   r  r8  r2   r2   r6   write_undefinedQ  s
    

z%ImageFileDirectory_v2.write_undefined
   c                   s`   |  t|d  d|}ddddfdd t fdd	t|d d d
 |dd d
 D S )Nr-   r-  r`   r:  r;  c                   s    r| |fS t | |S rk   r=  r>  r?  r2   r6   r@  _  s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  s   | ]\}} ||V  qd S rk   r2   rA  rC  r2   r6   rS   b  r8   z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r+   r   rD  rF  r2   rH  r6   load_signed_rationalY  s    z*ImageFileDirectory_v2.load_signed_rationalc                   s   d  fdd|D S )Nr8   c                 3  s(   | ] } j d gt|ddR  V  qdS )Z2lii   N)r   rv   rJ  r   r2   r6   rS   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	IO[bytes])fpr   rZ   c                 C  s8   | |}t||kr4d| dt| d}t||S )Nz&Corrupt EXIF data.  Expecting to read  bytes but only got z. )readrR   OSError)ry   rR  r   retr   r2   r2   r6   _ensure_readk  s    
z"ImageFileDirectory_v2._ensure_read)rR  rZ   c              
   C  s  |    | | _z8| jr0| d| |dn| d| |dd }t|D ]}| jrp| d| |dn| d| |d	\}}}}t|| j	j
}t|d
}	d| d| d|	 d| d	}
z| j| \}}W n$ ty   td|
| Y qPY n0 || }|| jrdndkrt| }| | jr4dnd|\}|
d| d| 7 }
|| t||}|| n|d | }t||krtd| dt| d|  t|
 qP|st|
 qP|| j|< || j|< |
d7 }
|
|dkr d| dnt|7 }
t|
 qP| jr2| d| |dn| d| |d\| _W n6 ty }
 ztt|
 W Y d }
~
d S d }
~
0 0 d S )Nr   r1   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 rS  z. Skipping tag z
 - value: rC   <table:  bytes>)r   tellr   r   r   rW  ranger   r   r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readrR   r  r  r   r   r   r   rU  rw   )ry   rR  Z	tag_countro   r  r  countr   tagnametypnamer   Z	unit_sizer  r   hereoffsetr2   r2   r6   loadu  sr    







"
zImageFileDirectory_v2.loadc                 C  sZ   | j | d| jrdnd }| jr4|| ddd7 }|| jrH| ddn
| d	d7 }|S )
Nr*  r   *   ZHHr1   r   r   r>   r;   )r   r   r   ry   r   r2   r2   r6   _get_ifh  s
    "zImageFileDirectory_v2._get_ifhr   )rm  rZ   c              
     sh  |  | jrdndt| j}g } t|t| j| jr:dnd  d 7  d }| jrVdnd}| jrddnd}t| j D ]\}}|tkrt|}| j| }	t	d||	t
| |	tjkot|t}
|
rt|  |d	}| j| }| D ]\}}|||< q| }n,t|tr|n|f}| j|	 | g|R  }t|| jj}|
rNd
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 qv|||	||  | |f  t|d d d 7  qv|d ur|| \}}	}}}|r| j|	 \}} fdd|| || j D }| j|	 | g|R  }n|  || !||d   }||	|||f||< |D ]N\}}	}}}t	d||	|t
|t
| ||  | jrdnd||	||7 }q|d7 }|D ].\}}	}}}||7 }t|d@ r4|d7 }q4|S )Nr   r*  rY  r<   r-   r;   r1   zTag %s, Type: %s, Value: %s)r   ifdr[  zsave: r\  r]  z) - value: r>   r_  r`  r   r4  r8   r+   c                   s   g | ]}|  qS r2   r2   )r3   ra   rm  r2   r6   r    r8   z1ImageFileDirectory_v2.tobytes.<locals>.<listcomp>r   z%s %s %s %s %srX  rZ  s       )"r   r   rR   r   sortedr   STRIPOFFSETSr   re  rf  r   r   r  r   r   r   rq  tobytesrs   r   r   r   r   r   rc  rw   r  r  r  appendljustr   r   r   )ry   rm  resultentriesZstripoffsetsr   Zfmt_sizer  r   r  r!  rr  r   Zifd_tagZ	ifd_valuer   rj  rk  r   ri  r   r  r2   rs  r6   rv    sj    (


*



zImageFileDirectory_v2.tobytesc                 C  sB   |  dkr||   |  }| |}|| |t| S r   )ra  writerq  rv  rR   )ry   rR  rm  ry  r2   r2   r6   save  s    

zImageFileDirectory_v2.save)r   NN)T)T)T)T)T)r   )7r   r   r   r   r   __annotations__r   r   r   rY   rm  r   setterr   r   r   r   r  r  r
  r	  r$  r'  r   r   listmapr   r   r  r  ZSIGNED_BYTEr  r  FLOATr  ZIFDLONG8r   r0  r   r3  r7  r9  rI  rK  rL  rM  rO  rP  rW  rn  rq  rv  r|  r2   r2   r2   r6   r     s   
<   '^








 
 

CMr   r   r   Zwrite_c                      s   e Zd ZU dZdddd fddZedd Zed	d Zd
ed< e	dd dddZ
ddddZdddddZddddZddddZdddddd Zdd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
    r
   r   )rz   kwargsrZ   c                   s   t  j|i | d| _d S )NT)superr   r   )ry   rz   r  	__class__r2   r6   r   4  s    zImageFileDirectory_v1.__init__c                 C  s   | j S rk   )r   r   r2   r2   r6   r   8  r8   zImageFileDirectory_v1.<lambda>c                 C  s   | j S rk   )r   r   r2   r2   r6   r   9  r8   zdict[int, int]r   r   )originalrZ   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`

        r]   )rY   r   r   r   )clsr  rr  r2   r2   r6   from_v2?  s
    zImageFileDirectory_v1.from_v2r   c                 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`

        r]   )r   rY   r   r   r   r   )ry   rr  r2   r2   r6   to_v2Q  s
    zImageFileDirectory_v1.to_v2r   rX   r  c                 C  s   || j v p|| jv S rk   )r   r   r  r2   r2   r6   r  b  s    z"ImageFileDirectory_v1.__contains__r`   c                 C  s   t t| jt| jB S rk   )rR   r   r   r   r   r2   r2   r6   r   e  s    zImageFileDirectory_v1.__len__r%  c                 C  s   t t| jt| jB S rk   )r&  r   r   r   r   r2   r2   r6   r'  h  s    zImageFileDirectory_v1.__iter__r  c                 C  s   dD ]}|  ||| qd S N)FT)r	  )ry   r  r   r   r2   r2   r6   r
  k  s    z!ImageFileDirectory_v1.__setitem__c                 C  sn   || j vrL| j| }| j| }| j| \}}dD ]}| ||| ||| q0| j | }t|ttfsj|f}|S r  )r   r   r   r   r	  r   rs   rW   )ry   r  r   r  r   r  legacyra   r2   r2   r6   r  o  s    



z!ImageFileDirectory_v1.__getitem__)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ddd fd	d
ZddddZeddddZ	dddddZ
dddddZddddZddddZdd fddZddddZddd d!Zddd"d#Zddd$d%Z  ZS )'TiffImageFileZTIFFz
Adobe TIFFFNStrOrBytesPath | IO[bytes]zstr | bytes | Noner   )rR  filenamerZ   c                   s   |  |  t  || d S rk   )r  r   )ry   rR  r  r  r2   r6   r     s    zTiffImageFile.__init__r   c                 C  s   | 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 filer1   r+   r   rc   Nz*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )rR  rT  r   tag_v2r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesre  rf  r   _seekrp  r2   r2   r6   _open  s    

zTiffImageFile._openr`   c                 C  sb   | j }|d u rN|  }| t| j | j d u rD| |  d  q&| | | j d us\J | j S )Nr   )r  ra  r  rR   r  rg  )ry   Zcurrent_n_framescurrentr2   r2   r6   n_frames  s    

zTiffImageFile.n_frames)framerZ   c                 C  sH   |  |sdS | | | jdurD| jj| jks>| jj| jkrDd| _dS )z%Select a given frame as current imageN)Z_seek_checkr  _imimr   
_tile_sizemode)ry   r  r2   r2   r6   rg    s    


zTiffImageFile.seekc                 C  st  | j | _t| j|kr| js(d}t|td|| j| j| j	  | jdkrZd}t
|| j| j | j| j td| j	  | j| j | jj| jv rd| _n
| jj| _| jdkr|d | _t| jdkr| jdk| _|  jd7  _q| j| j|  | j| j t| jv r2| jt | jd< nd| jv rF| 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  rR  rR   r  r  EOFErrorre  rf  r  ra  r  rg  rw  r  rn  r   r  is_animatedXMPr  Z_reload_exifr  r  r  rr  _setup)ry   r  r   r2   r2   r6   r    sJ    



zTiffImageFile._seekc                 C  s   | j S )zReturn the current frame number)r  r   r2   r2   r6   ra    s    zTiffImageFile.tellzdict[int, dict[str, bytes]]c                 C  s   i }| j tjj}|r|dd dkrt|dd }t|d d d d }t|d| d|  }|d| d| |  }d|i||< |td| | d d d }q|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.
        Nr-   s   8BIMr/   r   r+   rN  r   )	r  rc  r   BaseZImageResourcesi16mathceili32)ry   blocksra   idnr   r   r2   r2   r6   get_photoshop_blocks  s    $z"TiffImageFile.get_photoshop_blockszImage.core.PixelAccess | Nonec                   s   | j r| jr|  S t  S rk   )tileuse_load_libtiff_load_libtiffr  rn  r   r  r2   r6   rn  
  s    zTiffImageFile.loadc                 C  s:   | j d u r*t| j tj| j| j| _tj	|  d S rk   )
r  r   Z_decompression_bomb_checkr  corenewr  r  r   load_preparer   r2   r2   r6   r    s    
zTiffImageFile.load_preparec                 C  s`   | j s4d| _|  }tjD ]}||vr(q|| qtj| dd tj	j
| jv r\| jtj	j
= d S )NT)Zin_place)r  !_close_exclusive_fp_after_loadingZgetexifr   TAGS_V2_GROUPSget_ifdr   Zexif_transposer   r  Orientationr  )ry   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 }z0t| jdo`| j }t| jdrx| j	  W n ty   d}Y n0 |rt
|tsJ t|}||d< t|}t | jd	|| j}z|| j| W n4 ty } zd
}t||W Y d}~n
d}~0 0 | jo&| j }t| jdrVtd || j \}	}
n||rtd |sx| jd t|dtj}|d\}	}
t||tj n*td | jd || j \}	}
g | _d| _|    |r| j!  d| _|
dk rt|
t j | S )zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r,   filenoflushFr+   libtiffzCouldn't set the imageN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 reading)"r   rn  r  rR   r  rU  r   rR  r  r  r   rs   r  Z_getdecoderr  Zdecoderconfigsetimager  r  Z_exclusive_fpr  re  rf  r6  r  rg  oslseekSEEK_CURSEEK_SETrT  readonlyr  close)ry   r   Zextentsrz   rR  Z	args_listdecodereZclose_self_fpr  errposr2   r2   r6   r  &  s^    
 





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rVd}| 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 n4 ty } zd}t||W Y d}~n
d}~0 0 t|trt|ts(d}t|||f| _| j tjj}|dv rX||f| _n
||f| _t
d| j | j td}t|dkrt|t|  krdkrn nd}| j td}	| j td}
|dv rd}n|dkrd}nd}|t|
7 }t|	}| j t | jdkr*|dv r*dnd}|t!krRt
"d| d}t#|||k rj|	d| }	n||kr|dkr|	| }	t|	|krd}t#|| j j$||||	|
f}t
d| zt%| \| _&}W n> ty } z$t
d d}t#||W Y d}~n
d}~0 0 t
d| t
d | j' | j| j(d!< | j t)d}| j t*d}|r|r| j t+}|d"kr||f| j(d#< nX|dkr|d$ |d$ f| j(d#< n6|du r||f| j(d#< ||f| j(d%< n||f| j(d%< d } }}g | _,t-p| jd&k| _.| j.r|d"krJ|dd d |dd  }t
d| t%| \| _&}|dkrr| jd'krr| jdkrrd(}n8|d)krd*}n(|/d+s|/d,r|dd- d. }|| jd/| j j0f}| j,1t23d0dd||fd| nrt4| j v st5| j v r<t4| j v r"| j t4 }| j t6|}|}nJ| j t5 }| j t7}| j t8}t|tr\t|tshd1}t||}|D ]}|| |kr|t9|	 d2 }nd}|}| jd"kr|| }|| }|t|df}| j,1t23| j||t|| |t|| |f|| || }||krpd||  }}||krpd }}|d7 }qpnt
d3 d}t#|t:| j v rn| j t: | j(d4< | j'd5v rd6d7 | j t; D }t<=d8d9>|| _?dS ):z-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/   r0   r1   z
- size: %sr9   r2   )r+   r/   r1   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compressionr+   dpigRQ@
resolutionr%   r'   rJ   r=   I;16Nz;16Bz;16Lrc   NFr  zInvalid tile dimensionsr1   z- unsupported data organizationicc_profilerN   rO   c                 S  s   g | ]}t |d  qS r"   r   )r3   r+  r2   r2   r6   r  o  r8   z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr8   )@r  rU  COMPRESSION_INFOrc  COMPRESSION_compressionPLANAR_CONFIGURATIONZ_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERre  rf  YCBCRSUBSAMPLING
IMAGEWIDTHIMAGELENGTHrd  	TypeErrorr   r`   r  r  r   r  r  _sizer   SAMPLEFORMATrR   rt   rr   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELerrorr   rY   	OPEN_INFO_moder  r  X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  r5  rm  rw  r   _Tileru  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr   r%   r   palette) ry   r   photoZ	fillorderZxsizeZysizer  ZorientationZsample_formatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamples_per_pixelr  rawmodeZxresZyresZresunitxyZlayerr<  offsetsr,  wZ	tilewidthrm  strideZtile_rawmoderz   r  r2   r2   r6   r    s0   



 


2




 




$




zTiffImageFile._setup)N)r   r   r   formatformat_descriptionr  r   r  r   r  rg  r  ra  r  rn  r  r  r  r  r  r2   r2   r  r6   r    s"    ,_r  r:   r;   rI   rN   rO   rG   r=   rA   rE   rJ   rL   rK   rP   YCbCrrQ   rH   r?   rB   rF   )r:   r;   rI   rN   rO   r@   r=   rA   rD   rJ   rL   rK   rP   r  rQ   rH   r?   rB   rF   zImage.ImagerQ  zstr | bytes)r  rR  r  rZ   c           6      C  s	  zt | j \}}}}}}W n< tyV }	 z$d| j d}
t|
|	W Y d }	~	n
d }	~	0 0 | j}| j}t|d}|dr~d|_z|d }W n, ty   | j	d}t
|trd }Y n0 |d u rd}n|dkrd	}n|d
krd}tp|dk}d|t< | jd |t< | jd |t< d|v r$|d }n:d|v rZ|d }t
|tr^t }|| |}ni }tdt| t
|tr| }|D ]h}t
|tjr|tjv r||||< n||||< z|j| |j|< W n ty   Y n0 qi }t| dr
| j  }i |t!| di }t"t#fD ]}||v r&||= q&t| drt$t%t&t't(t)fD ]^}|| j*v rZ|t'kr| j*j| tj+tj,fvr||= n | j*| ||< | j*j| |j|< qZ|d| j	d}|r||t-< t.dft%dft&dft%dft&dft$dft/dft0dft1dft2dff
D ] \}}||v r|| ||< q|d}|rnd|t$< |d |t%< |d |t&< |dkr||t3< t4|dkrt4||t5< |d ur||t6< |dkr||t#< t7|vr||t7< n| jd v rh|t7 dkrh| jd!kr^| 8 }| }|d urht9|j:D ]:}t9|j;D ](}|||f d"krDdnd"|||f< q*q|} n
t<=| } | jd#v r| j>?d$d%}g }t4|d& }t9d&D ]>} |d'd( |||  || d   D 7 }|dgd)|  7 }q||t@< |t |t  }!}"t4||!|d  d* d+  }#tA|vr|rj|d,tB}$|#dkr:dntC|$|# |"}%|d	krntC|%d* d+ d+ |"}%n|"}%|%dkr|d}%|%|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rPtJd/tKd0iL D ]\}}(|M||( q8tNtOtPtQg})|	r.d1|v r|d1 }*t
|*tr|*dk s|*d2krd3}
tR|
|d	krd4}
tR|
|*|tS< td5 td6tT|L  d}+t|d7rz|Ud |V }+W n tWjXy   Y n0 i },|)tYtKtEtGtZt[g7 })t3|d i}-t\]|L |L D ]\}}.|tj^vrt!tj_d8d9szqR|tjv rtj`|,|< nP||jv r|j| |,|< n4t
|.ttatbtfsȐqRntc|jd}/|/r|/|,|< ||-vrR||)vrRt
|.tbr|.ed:d;d< |-|< n"t
|.tfr2ta|.|-|< n|.|-|< qRt#|-v rjt4|-t# dkrj|-t# d |-t#< td=tT|-L  | jd>v rd?}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rؐ	qq|3dk 	rrdB|3 dC}
t|
nD|)D ]}||= 	q2|m|}5tjn| |tjoddA| j |5||#dfg dD|v 	rtp| dD| d S )ENzcannot write mode z as TIFFr]   Zbig_tiffTr  r%   r&   r'   r)   r(   r   r   Ztiffinfor  zTiffinfo Keys: %sr  r  r  descriptionr  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr  r+   r9   )r:   r;   r:   r!   r  rJ   r  r,   c                 S  s   g | ]}|d  qS r  r2   r  r2   r2   r6   r  +  r8   z_save.<locals>.<listcomp>r"   r0   r1   Z
strip_sizer    r  )r   r   )r   r!      r!   r  r!   qualityd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr  rV   Fr  r   r4  zConverted items: %s)r?   r=   r  r  rM   zencoder error z when writing image fileZ_debug_multipage)q	SAVE_INFOr  rd  rU  encoderinfoencoderconfigr   rc  r   r  r   r`   WRITE_LIBTIFFr  r   r  r  rW   r   ZExifrn  re  rf  r  r  r  r   r  r  r   r   r   r  r{   EXIFIFDr  r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKr  r  r  r  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  rR   r  r  r  copyrb  heightwidthr   invertr  Z
getpaletter  r  
STRIP_SIZErr   r  STRIPBYTECOUNTSrs   ru  COMPRESSION_INFO_REVr  r  REFERENCEBLACKWHITEr   
setdefaultr  r  r  TILEBYTECOUNTSr  JPEGQUALITYrt  rg  r  ioUnsupportedOperationOSUBFILETYPETRANSFERFUNCTIONSUBIFD	itertoolschainZLIBTIFF_COREr  r  rm   rw   r   r  r  re   sortZ_getencoderr  r   ZMAXBLOCKr{  r|  _saver  setattr)6r  rR  r  r  rY   r  r  bitsextrar  r   r  r  rr  r  r  r  r  r  Z
legacy_ifdZsupplied_tagsr  Ziccr   r  Zinverted_imZpxr  r  ZlutZcolormapcolorsro   r  r,  r  Zim_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imagedefault_valueZ	blocklistr  r  typesZattsr   r  r  r<  encodererrcoder   rm  r2   r2   r6   r%    s    



















*
&





 









r%  c                   @  s  e Zd Zg dZh dZdOdddddd	Zdd
ddZdd
ddZdd
ddZd d
ddZ	dddddZ
dd
ddZejfddddddZdd
ddZddd d!d"Zdd
d#d$Zd%dd&d'd(Zddd)d*d+Zddd)d,d-Zdd
d.d/Zdd
d0d1Zed2ddd3d4d5Zddd6d7d8Zdddd9d:d;Zddd6d<d=Zddd6d>d?Zddd6d@dAZddd6dBdCZdd
dDdEZdd
dFdGZ ddddHdIdJZ!dPdddddKdLdMZ"dNS )QAppendingTiffWriter)r   r   r   r+   r-   r1   r   r   r+   r-   r1   r-   r1   r-   r+   r-   r1   >   i   r$   i  i  i	  r#   Fr  rX   r   )fnr  rZ   c                 C  s   |  t |rR|| _d| _zt||r&dnd| _W qh tyN   t|d| _Y qh0 nttt || _d| _| j	 | _
|   d S )NTzw+bzr+bF)r   r   close_fpopenr   rU  r   r   rW   ra  	beginningsetup)ry   r/  r  r2   r2   r6   r     s    zAppendingTiffWriter.__init__r   c                 C  s   | j | jtj d | _d| _| j d | _}|s>d| _	d S d| _	|dkrX| 
d n |dkrl| 
d nd	}t||   |   d S )
Nr   r-   TFrU   r   rT   r   zInvalid TIFF file header)r   rg  r2  r  r  whereToWriteNewIFDOffsetoffsetOfNewPagerT  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)ry   iimmr   r2   r2   r6   r3    s     zAppendingTiffWriter.setupc                 C  s   | j r
d S | j| j | jd}|s,d S || jkrBd}t||  }|| j7 }| jd usbJ | j| j | 	| | j| | 
  d S )Nr-   z1IIMM of new page doesn't match IIMM of first page)r7  r   rg  r5  rT  r6  r9  readLongr4  	writeLongfixIFD)ry   r<  r   
ifd_offsetr2   r2   r6   finalize  s     


zAppendingTiffWriter.finalizec                 C  s   |    |   d S rk   )rA  r3  r   r2   r2   r6   newFrame'  s    zAppendingTiffWriter.newFramec                 C  s   | S rk   r2   r   r2   r2   r6   	__enter__,  s    zAppendingTiffWriter.__enter__r   )rz   rZ   c                 G  s   | j r|   d S rk   )r0  r  r}   r2   r2   r6   __exit__/  s    zAppendingTiffWriter.__exit__r`   c                 C  s   | j  | j S rk   )r   ra  r5  r   r2   r2   r6   ra  3  s    zAppendingTiffWriter.tell)rm  whencerZ   c                 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  r5  r   rg  ra  )ry   rm  rE  r2   r2   r6   rg  6  s    

zAppendingTiffWriter.seekc                 C  s^   | j dtj | j  }d|d  }d|  k r:dk rNn n| j t| | j  | _d S )Nr   r>   )r   rg  r  SEEK_ENDra  r{  rW   r5  )ry   r  Z	pad_bytesr2   r2   r6   r;  C  s    
zAppendingTiffWriter.goToEndrw   )endianrZ   c                 C  s4   || _ | j  d| _| j  d| _| j  d| _d S )Nr;   r*  ZHHL)rG  longFmtshortFmt	tagFormat)ry   rG  r2   r2   r6   r8  M  s    zAppendingTiffWriter.setEndianc                 C  sP   |   }|dkr"| j d | _qL| j| |  }| j|d tj q d S )Nr   r-   r<   )r=  r   ra  r4  rg  	readShortr  r  )ry   r@  num_tagsr2   r2   r6   r:  S  s    zAppendingTiffWriter.skipIFDsr   r1  c                C  s   | j |S rk   )r   r{  r2  r2   r2   r6   r{  ^  s    zAppendingTiffWriter.write)
field_sizerZ   c                 C  s6   zdddd| W S  t y0   d}t|Y n0 d S )Nr*  r;   r   )r+   r-   r1   zoffset is not supported)rd  r9  )ry   rM  r   r2   r2   r6   _fmta  s
    zAppendingTiffWriter._fmtc                 C  s&   t | j| | | j|\}|S rk   )r   r(  rG  rN  r   rT  )ry   rM  r   r2   r2   r6   _readh  s    zAppendingTiffWriter._readc                 C  s
   |  dS Nr+   rO  r   r2   r2   r6   rK  n  s    zAppendingTiffWriter.readShortc                 C  s
   |  dS r[   rQ  r   r2   r2   r6   r=  q  s    zAppendingTiffWriter.readLongr   )bytes_writtenexpectedrZ   c                 C  s,   | d ur(| |kr(d|  d| }t |d S )Nzwrote only z bytes but wanted )r9  )rR  rS  r   r2   r2   r6   _verify_bytes_writtent  s    z)AppendingTiffWriter._verify_bytes_writtenr   c                 C  s6   | j dtj | j t| j|}| |d d S )Nr-   )	r   rg  r  r  r{  r   r)  rH  rT  ry   r   rR  r2   r2   r6   rewriteLastShortToLongz  s    z*AppendingTiffWriter.rewriteLastShortToLong)r   rM  rZ   c                 C  sB   | j | tj | j t| j| | |}| 	|| d S rk   )
r   rg  r  r  r{  r   r)  rG  rN  rT  )ry   r   rM  rR  r2   r2   r6   _rewriteLast  s
    z AppendingTiffWriter._rewriteLastc                 C  s   |  |dS rP  rX  r8  r2   r2   r6   rewriteLastShort  s    z$AppendingTiffWriter.rewriteLastShortc                 C  s   |  |dS r[   rY  r8  r2   r2   r6   rewriteLastLong  s    z#AppendingTiffWriter.rewriteLastLongc                 C  s&   | j t| j|}| |d d S rP  )r   r{  r   r)  rI  rT  rV  r2   r2   r6   
writeShort  s    zAppendingTiffWriter.writeShortc                 C  s&   | j t| j|}| |d d S r[   )r   r{  r   r)  rH  rT  rV  r2   r2   r6   r>    s    zAppendingTiffWriter.writeLongc                 C  s   |    | jr| j  d S rk   )rA  r0  r   r  r   r2   r2   r6   r    s    zAppendingTiffWriter.closec                 C  s   |   }t|D ]}t| j| jd\}}}| j| }|| }|dk}|sf|  | j	 }	| 
|	 || jv r| j }
|r| || | j|
d  q| j|	 | || | j|
 q|r| jdtj qd S )Nr1   r-   )rK  rb  r   r(  rJ  r   rT  
fieldSizesr=  r5  r[  Tagsra  _fixOffsetsrg  r  r  )ry   rL  ro   r  Z
field_typeri  rM  Z
total_sizeis_localrm  Zcur_posr2   r2   r6   r?    s&    



zAppendingTiffWriter.fixIFD)ri  rM  rZ   c                 C  s   t |D ]}| |}|| j7 }|dkr||dkr||dkrDd}t|| | | jdtj | 	t
j | jdtj q| || qd S )Nr+   r    r   znot implementedir1   )rb  rO  r5  r9  rW  r   rg  r  r  r\  r   r  rX  )ry   ri  rM  ro   rm  r   r2   r2   r6   r_    s    


zAppendingTiffWriter._fixOffsets)ri  isShortisLongrZ   c                 C  s$   |r
d}n|rd}nd}|  ||S )Nr+   r-   r   )r_  )ry   ri  ra  rb  rM  r2   r2   r6   
fixOffsets  s    zAppendingTiffWriter.fixOffsetsN)F)FF)#r   r   r   r]  r^  r   r3  rA  rB  rC  rD  ra  r  r  rg  r;  r8  r:  r{  rN  rO  rK  r=  staticmethodrT  rW  rX  rZ  r[  r\  r>  r  r?  r_  rc  r2   r2   r2   r6   r.    s>   	
 r.  c              	   C  s   | j  }| j}t|dg }t| ds:|s:t| ||S |  }zt|v}| g| D ]Z}||_ ||_t|dsxd}	n|j	}	t
|	D ]*}
||
 |  t||| |  qqXW d    n1 s0    Y  W | | n| | 0 d S )Nappend_imagesr  r   )r  r  r  r  rc  r   r%  ra  r.  r  rb  rg  rn  rB  )r  rR  r  r  r  re  Zcur_idxtfZimsZnfrr   r2   r2   r6   	_save_all  s(    



,rg  z.tifz.tiffz
image/tiff)
__future__r   r  r"  loggingr  r  r   r  collections.abcr   r   Z	fractionsr   Znumbersr   r   typingr   r	   r
   r   r   r    r   r   r   r   r   r   _binaryr   r  r   r  r   Z
_deprecater   _typingr   Z_utilr   r   r   r   	getLoggerr   re  r  r	  r  r   r   r  r  r  r  r  r  r  r  ru  r  r  r  r  r  r  r  r   r  r  r  Z	PREDICTORr  r  r  r  r  r!  r  r  Z
JPEGTABLESr  r  r  r  r  r  r
  r  r  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr  r   r  r  rt   r  r\   r{   r  r^   ri   rv   r   r   r   re   rW   rX   r   r   r   r   r`   Z
_IFDv2Baser   r   r   r   r&  r  ZImageFileDirectoryr  r  r%  BytesIOr.  rg  Zregister_openr  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer2   r2   r2   r6   <module>)   s(    
~	
	     \   |  8  