o
    _#a                    @   s6  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 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 ddlmZ ddlmZ eeZd	Zd	Zd
ZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.d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@d0ZAd1ZBd2ZCd3ZDd4ZEd5ZFi dd6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVZGdWdX eGH D ZIi ed dYddYdZfd[ed dYddYdZfd[ed dYd7dYdZfd\ed dYd7dYdZfd\eddYddYdZfd]eddYddYdZfd]eddYd7dYdZfd^eddYd7dYdZfd^ed dYdd_dZfd`ed dYdd_dZfd`ed dYd7d_dZfdaed dYd7d_dZfdaeddYdd_dZfdbeddYdd_dZfdbeddYd7d_dZfdceddYd7d_dZfdced dYddddZfdei ed dYddddZfdeed dYd7dddZfdfed dYd7dddZfdfeddYddddZfdgeddYddddZfdgeddYd7dddZfdheddYd7dddZfdhed dYddidZfdjed dYddidZfdjed dYd7didZfdked dYd7didZfdkeddYddidZfdleddYddidZfdleddYd7didZfdmeddYd7didZfdmeddYddndZfdoeddYddpdZfdqi eddYddpdZfdredd_ddpdZfdsedd_ddpdZfdted duddvdZfdwed duddvdZfdxeddYddvdZfdyedd_ddvdZfdzedd_ddvdZfd{edduddvdZfdwedduddvdZfdxeddYdd|d_fd}eddYdd|d_fd}ed7dYdd~dZfded7dYdd~dZfded7dYd7d~dZfded7dYd7d~dZfded7dYdddZfdi ed7dYdddZfded7dYdddfded7dYdddfded7dYdddfded7dYdddfded7dYdddfded7dYdddfded7dYdddYfded7dYdddYfded7dYdddfded7dYdddfded7dYdddfded7dYdddfded7dYddd_fded7dYddd_fded7dYdddfded7dYdddfdi ed7dYdddfded7dYdddfded7dYdddfded7dYdddfded7dYdddZfded7dYdddZfded7dYdddZfded7dYdddZfded7dYdddfded7dYdddfded7dYdddYfded7dYdddYfded7dYddd_fded7dYddd_fded9dYddYdZfded9dYddYdZfded9dYd7dYdZfdi ed9dYd7dYdZfded9dYdd_dZfded9dYdd_dZfded9dYd7d_dZfded9dYd7d_dZfded9dYddddZfded9dYddddZfded9dYd7dddZfded9dYd7dddZfded9dYddidZfded9dYddidZfded9dYdd|d_fded9dYdd|d_fded9dYd7didZfded9dYd7didZfded=dYdddZfded=dYdddZfded=dYdddfded=dYdddfded=dYdddfded=dYdddfded=dYdddZfded?dYdd~dZfded?dYdd~dZfdedCdYdd~dZfdedCdYdd~dZfdi	ZJg dZKdd ZLdd ZMdd ZNi ZOi ZPG dd deZQG dd deZReOeR_OePeR_PeH D ]!\ZSZTeTUddZTeVeRdeT eOeS d  eVeRdeT ePeS  q[O[P[S[TG dd deRZWeWZXG dd dejZYi ddedddYdfddedddidfddeddd|d7fdded9ddidfdded9dd|d7fddedd7dvdfddedddpdfddedd7dpdfddedd9dvdfdded7dd~dfdded7ddd fdded7ddd7fdded=dddfdded?dd~dfddedCdd~dfddedd7dvdfddedddpdfdedd7dpdfdedd9dvdfd֜ZZdd؄ Z[G ddڄ dڃZ\dd܄ Z]e^eYj_eYeL e`eYj_e[ eaeYj_e] ebeYj_ddg eceYj_dߡ dS )    N)MutableMapping)Fraction)NumberRational   )Image	ImageFileImageOpsImagePaletteTiffTagso8TYPESFT   s   IIs   MM   i  i  i  i  i
  i    i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  B  C  D  iE  iJ  iR  iS  i[    i  i  i  iI  is  ii    i  i  i  raw   
tiff_ccitt   group3   group4   tiff_lzw   	tiff_jpeg   jpeg   tiff_adobe_deflatei  tiff_raw_16i  packbitsi)  tiff_thunderscani  tiff_deflateit  tiff_sgilogiu  tiff_sgilog24im  lzmaiP  zstdiQ  webpc                 C   s   i | ]\}}||qS  r0   ).0kvr0   r0   5/usr/lib/python3/dist-packages/PIL/TiffImagePlugin.py
<dictcomp>   s    r5   r   r0   )1z1;I)r7   z1;IR)r7   r7   )r7   z1;R)r   )LzL;2I)r8   zL;2IR)r8   zL;2)r8   zL;2R)r   )r8   zL;4I)r8   zL;4IR)r8   zL;4)r8   zL;4R)r%   )r8   zL;I)r8   zL;IR)r8   r8   )r8   zL;R)   )I;16zI;12)   )r:   r:   )I;16Br<   )II;16S)r=   I;16BS)r   )    )FF;32F)rA   F;32BF)r=   zI;32N)r=   I;32S)r=   I;32BS)r%   r%   )LArF   )r%   r%   r%   )RGBrG   )rG   zRGB;R)r%   r%   r%   r%   )RGBArH   r   )RGBXrJ   )r%   r%   r%   r%   r%   r   r   )rJ   RGBXX)r%   r%   r%   r%   r%   r%   )r   r   r   )rJ   RGBXXX)rH   RGBa)r   r   )rH   RGBaX)r   r   r   )rH   RGBaXX)r   r   )rH   RGBAX)r   r   r   )rH   RGBAXX)i  )r;   r;   r;   )rG   zRGB;16L)rG   zRGB;16B)r;   r;   r;   r;   )rH   zRGBA;16L)rH   zRGBA;16B)rJ   zRGBX;16L)rJ   zRGBX;16B)rH   zRGBa;16L)rH   zRGBa;16B)PzP;1)rS   zP;1R)rS   zP;2)rS   zP;2R)rS   zP;4)rS   zP;4R)rS   rS   )PArT   )rS   zP;R)CMYKrU   )rU   CMYKX)rU   CMYKXX)rU   zCMYK;16L)rG   rJ   )LABrX   )   MM *   II* s   MM* s   II *c                 C   s   | d d t v S Nr   )PREFIXESprefixr0   r0   r4   _accept     r_   c                 C   s<   t | dk}t|rd|  n| |}|r|d d d S |S )Nr   )absIFDRationallimit_rational)valmax_valinvn_dr0   r0   r4   _limit_rational  s   ri   c                 C   sP   t | }|j|jf}t||k rt| t|}t||kr&t | } t| |}|S N)r   	numeratordenominatorminri   rb   max)re   rf   min_valfracrh   r0   r0   r4   _limit_signed_rational  s   
rq   c                   @   sB  e Zd ZdZ	 dZd3ddZedd Zedd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Z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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)d2S )4rc   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_denominator_valr   c                 C   s   t |tr|j| _|j| _|j| _dS t |tr!|j| _|j| _n|| _|| _|dkr2td| _dS |dkr=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   rk   rr   rl   rs   rt   r   float)selfvaluerl   r0   r0   r4   __init__4  s   


zIFDRational.__init__c                 C      | j S rj   )rr   ar0   r0   r4   rk   N     zIFDRational.numeratorc                 C   r{   rj   )rs   r|   r0   r0   r4   rl   R  r~   zIFDRational.denominatorc                 C   s.   | j dkr| j| j fS | j|}|j|j fS )z

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )rl   rk   rt   limit_denominator)rx   max_denominatorfr0   r0   r4   rd   V  s   
zIFDRational.limit_rationalc                 C   s   t t| jS rj   )strrw   rt   rx   r0   r0   r4   __repr__c  s   zIFDRational.__repr__c                 C   s
   | j  S rj   )rt   __hash__r   r0   r0   r4   r   f  s   
zIFDRational.__hash__c                 C   s0   | j }t|tr|j }t|trt|}||kS rj   )rt   rv   rc   rw   )rx   otherre   r0   r0   r4   __eq__i  s   

zIFDRational.__eq__c                 C   s   | j | j| jgS rj   )rt   rr   rs   r   r0   r0   r4   __getstate__q  r`   zIFDRational.__getstate__c                 C   s,   t | d |\}}}|| _|| _|| _d S )Nr   )rc   rz   rt   rr   rs   )rx   statert   rr   rs   r0   r0   r4   __setstate__t  s
   

zIFDRational.__setstate__c                        fdd}|S )Nc                    s   t | j | S rj   )getattrrt   )rx   argsopr0   r4   delegate|  r`   z'IFDRational._delegate.<locals>.delegater0   )r   r   r0   r   r4   	_delegate{  s   zIFDRational._delegate__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__Nr6   )*__name__
__module____qualname____doc__	__slots__rz   propertyrk   rl   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   r0   r0   r0   r4   rc   &  sV    


rc   c                   @   s  e Zd ZdZd\ddZedd Zedd Zed	d Zej	d
d Zdd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zeeeejd*d+fejd,d-fejd.d/fejd0d1fej d2d3fej!d4d5fej"d6d7fej#d,d-fg ed8d8d]d:d;Z$ed8d<d= Z%ed>d8d]d?d@Z&ed>dAdB Z'edCdDd]dEdFZ(edCdGdH Z)edId8d]dJdKZ*edIdLdM Z+edNdDd]dOdPZ,edNdQdR Z-dSdT Z.dUdV Z/d^dXdYZ0dZd[ Z1dS )_ImageFileDirectory_v2a  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``.

       II*     Nc                 C   s   |dd t vrtdt| d|dur|n|dd | _| jtkr(d| _n| jtkr1d| _ntd|| _i | _	 | 	  | 
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.
        Nr   znot a TIFF file (header z not valid)r   ><znot a TIFF IFDr8   F)r\   SyntaxErrorrepr_prefixMM_endianIIgrouptagtypereset_unpacknext_legacy_api)rx   ifhr^   r   r0   r0   r4   rz     s   


zImageFileDirectory_v2.__init__c                 C   r{   rj   )r   r   r0   r0   r4   <lambda>      zImageFileDirectory_v2.<lambda>c                 C   r{   rj   )_offsetr   r0   r0   r4   r     r   c                 C   r{   rj   )r   r   r0   r0   r4   r     r   c                 C   s   t d)Nz"Not allowing setting of legacy api)	Exceptionrx   ry   r0   r0   r4   
legacy_api  s   z ImageFileDirectory_v2.legacy_apic                 C   s(   i | _ i | _i | _i | _d | _d | _d S rj   )_tags_v1_tags_v2_tagdatar   _nextr   r   r0   r0   r4   r     s   
zImageFileDirectory_v2.resetc                 C   s   t t| S rj   )r   dictr   r0   r0   r4   __str__     zImageFileDirectory_v2.__str__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 r0   )r   lookupr   name)r1   codery   r   r0   r4   r5     s    z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsr   r0   r   r4   named  s   
zImageFileDirectory_v2.namedc                 C      t t| jt| jB S rj   )lensetr   r   r   r0   r0   r4   __len__     zImageFileDirectory_v2.__len__c                 C   sf   || j vr| j| }| j| }| j| \}}|| || j| |< | j | }| jr1t|ttfs1|f}|S rj   )r   r   r   _load_dispatchr   rv   tuplebytes)rx   tagdatatypsizehandlerre   r0   r0   r4   __getitem__  s   



z!ImageFileDirectory_v2.__getitem__c                 C      || j v p	|| jv S rj   )r   r   rx   r   r0   r0   r4   __contains__)     z"ImageFileDirectory_v2.__contains__c                 C   s   |  ||| j d S rj   )_setitemr   )rx   r   ry   r0   r0   r4   __setitem__,  r   z!ImageFileDirectory_v2.__setitem__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 rGt
dd |D r@tjntj| j|< nkt
dd |D rt
dd |D r`tj| j|< nRt
dd |D rptj| j|< nBt
dd |D r|tjnt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rdd |D }| j| tjkot|t}|st fdd|D }|r| jn| j}|sO jdks| j| tjks jd u rOt|dkrO|sO|r'| j| tjtjfv r'|f}z|\||< W d S  tyN   td| dt| d |d ||< Y d S w |||< d S )Nc                 s       | ]}t |tV  qd S rj   )rv   rc   r1   r3   r0   r0   r4   	<genexpr>:      z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s       | ]}|d kV  qdS r   Nr0   r   r0   r0   r4   r   =      c                 s   r   rj   )rv   intr   r0   r0   r4   r   @  r   c                 s   s(    | ]}d |  kodk n  V  qdS )r   r   Nr0   r   r0   r0   r4   r   A     & c                 s   s(    | ]}d |  k odk n  V  qdS )i i   Nr0   r   r0   r0   r4   r   C  r   c                 s   r   r   r0   r   r0   r0   r4   r   H  r   c                 s   r   rj   )rv   rw   r   r0   r0   r4   r   K  r   c                 s   r   rj   )rv   r   r   r0   r0   r4   r   M  r   c                 s   r   rj   )rv   r   r   r0   r0   r4   r   O  r   c                 S   s&   g | ]}t |tr|d dn|qS )asciireplace)rv   r   encoder   r0   r0   r4   
<listcomp>S  s    z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S   s"   g | ]}t |trt|n|qS r0   )rv   r   rw   r   r0   r0   r4   r   X  s   " c                 3   s    | ]}  |V  qd S rj   )cvt_enumr1   ry   infor0   r4   r   \  r   r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   r   r   r   r   r   rv   r   type	UNDEFINEDallRATIONALSIGNED_RATIONALSHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr   r   r   r   lengthr   
ValueErrorwarningswarn)rx   r   ry   r   	basetypesvaluesis_ifddestr0   r   r4   r   /  sr   



 zImageFileDirectory_v2._setitemc                 C   s.   | j |d  | j|d  | j|d  d S rj   )r   popr   r   r   r0   r0   r4   __delitem__  s   z!ImageFileDirectory_v2.__delitem__c                 C   r   rj   )iterr   r   r   r   r0   r0   r4   __iter__  r   zImageFileDirectory_v2.__iter__c                 C   s   t | j| |S rj   )structunpackr   )rx   fmtr   r0   r0   r4   r     s   zImageFileDirectory_v2._unpackc                 G   s   t j| j| g|R  S rj   )r  packr   )rx   r  r  r0   r0   r4   _pack  r   zImageFileDirectory_v2._packc                    s    fdd}|S )Nc                    sB   ddl m} | jdr| jdd  dd| < | ft < | S )Nr   r   load_r   _ )r   r   r   
startswithr   r   )funcr   idxr   r0   r4   	decorator  s
   z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr0   )r  r   r  r0   r  r4   _register_loader  s   z&ImageFileDirectory_v2._register_loaderc                    r   )Nc                    s   | t  < | S rj   )_write_dispatch)r  r  r0   r4   r    s   z9ImageFileDirectory_v2._register_writer.<locals>.decoratorr0   )r  r  r0   r!  r4   _register_writer  s   z&ImageFileDirectory_v2._register_writerc                    sX   ddl m} | \} }|||< td  d fdd	ft|<  fddt|< d S )	Nr   r   =Tc                    s   |  t|    |S rj   )r   r   rx   r   r   r  r   r0   r4   r     s   z7ImageFileDirectory_v2._register_basic.<locals>.<lambda>c                    s   d  fdd|D S )N    c                 3   s    | ]	}  |V  qd S rj   )r  r   )r  rx   r0   r4   r     s    zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>joinrx   r  )r  r   r4   r     s   T)r   r   r  calcsizer   r   )idx_fmt_namer   r  r   r0   r%  r4   _register_basic  s   
z%ImageFileDirectory_v2._register_basicHshortr8   longbzsigned bytehzsigned shortlzsigned longr   rw   ddoubler   Tc                 C      |S rj   r0   r$  r0   r0   r4   	load_byte     zImageFileDirectory_v2.load_bytec                 C   r6  rj   r0   rx   r   r0   r0   r4   
write_byte  r8  z ImageFileDirectory_v2.write_byter   c                 C   s"   | dr|d d }|ddS )N    ra   zlatin-1r   )endswithdecoder$  r0   r0   r4   load_string  s   
z!ImageFileDirectory_v2.load_stringc                 C   s   d| dd d S )Nr&  r   r   r;  )r   r   r0   r0   r4   write_string  s   z"ImageFileDirectory_v2.write_stringr   r%   c                    V   |  t|d  d|}fdd t fddt|d d d |dd d D S )	Nr   r8   c                        r| |fS t | |S rj   rc   r}   r1  r   r0   r4   combine     z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3       | ]
\}} ||V  qd S rj   r0   r1   numdenomrE  r0   r4   r         z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   r   r   r   ziprx   r   r   valsr0   rE  r   r4   load_rational     0z#ImageFileDirectory_v2.load_rationalc                       d  fdd|D S )Nr&  c                 3   s(    | ]} j d gt|dR  V  qdS )2Ll    N)r  ri   r1   rp   r   r0   r4   r     s    
z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r'  r)  r0   r   r4   write_rational  s   z$ImageFileDirectory_v2.write_rationalr#   c                 C   r6  rj   r0   r$  r0   r0   r4   load_undefined  r8  z$ImageFileDirectory_v2.load_undefinedc                 C   r6  rj   r0   r   r0   r0   r4   write_undefined  r8  z%ImageFileDirectory_v2.write_undefined
   c                    r@  )	Nr   r3  c                    rA  rj   rB  rC  rD  r0   r4   rE    rF  z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3   rG  rj   r0   rH  rK  r0   r4   r     rL  z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   rM  rO  r0   rQ  r4   load_signed_rational  rS  z*ImageFileDirectory_v2.load_signed_rationalc                    rT  )Nr&  c                 3   s*    | ]} j d gt|ddR  V  qdS )2lii   N)r  rq   rV  r   r0   r4   r     s
    
z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r'  r)  r0   r   r4   write_signed_rational  s   z+ImageFileDirectory_v2.write_signed_rationalc                 C   s4   | |}t||krtd| dt| d|S )Nz&Corrupt EXIF data.  Expecting to read  bytes but only got z. )readr   OSError)rx   fpr   retr0   r0   r4   _ensure_read  s   
z"ImageFileDirectory_v2._ensure_readc              
   C   s  |    | | _zt| d| |dd D ]}| d| |d\}}}}t|| jj	}t
|d}d| d| d	| d| d
	}	z	| j| \}
}W n tya   t|	d|   Y qw ||
 }|dkr| }| d|\}|	d| d| 7 }	|| t||}|| n|d | }t||krtd| dt| d|  t|	 q|st|	 q|| j|< || j|< |	d|dkrd| nt| 7 }	t|	 q| d| |d\| _W d S  ty }	 ztt|	 W Y d }	~	d S d }	~	ww )Nr.  r   r   HHL4sr9   unknownztag:  (
) - type: )z - unsupported type r   r8   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r^  z. Skipping tag 
 - value: r@   <table: %d bytes>)r   tellr   ranger   rc  r   r   r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readr   r  r	  r   r   r   r   r`  r   )rx   ra  ir   r   countr   tagnametypnamemsg	unit_sizer   r   hereoffsetr0   r0   r4   load  sd   
 




zImageFileDirectory_v2.loadr   c                 C   s  |  dt| j}g }|t| t| jd  d }d }t| j D ]\}}|tkr/t|}| j|}t	d| d| dt
|  |tjkoNt|t}|ry| jdkrYd}	nd	}	t|	|d
}
| j| }| D ]\}}||
|< qj|
|}nt|tr|n|f}| j| | g|R  }t|| jj}|rdnt|d}d| d| d| d| d	}|dt|dkrdt| nt| 7 }t	| |rd}n|tjtjtjfv rt|}nt|}t|dkr|||||dddf q#|||||  d||f |t|d d d 7 }q#|d ur<|| \}}}}}|r%td|  d| d|d | }|||||f||< |D ]*\}}}}}t	| d| d| dt
| dt
| 	 ||  d||||7 }q>|d7 }|D ]\}}}}}||7 }t|d@ r|d7 }qo|S )Nr.  r9   r   zTag z, Type: z	, Value: r   s   II*    s   MM *   )r   ifdre  zsave: rf  rg  rh  ri  r;   rj  r   r;  r&  r8   r   z&multistrip support not yet implementedr   r  rd  s       ) r  r   r   sortedr   STRIPOFFSETSr   rm  ro  rp  r   r   r  rv   r   r   r   tobytesr   r   r   r   r   r   r   r  r  r   appendljustNotImplementedErrorr   )rx   rz  resultentriesstripoffsetsr   ry   r   r  r   r|  r  ifd_tag	ifd_valuer   ru  rv  rw  rt  r0   r0   r4   r  9  sj    





.zImageFileDirectory_v2.tobytesc                 C   sN   |  dkr|| j| ddd  |  }| |}|| |t| S )Nr   HL*   r%   )rk  writer   r  r  r   )rx   ra  rz  r  r0   r0   r4   save  s   

zImageFileDirectory_v2.save)r   NNr*  rI   )2r   r   r   r   rz   r   r^   rz  r   setterr   r   r   r   r   r   r   r   r  r  r   r  r  r"  r-  listmapr   r   r  SIGNED_BYTEr   r  FLOATr  IFDr7  r:  r>  r?  rR  rW  rX  rY  r[  r]  rc  r{  r  r  r0   r0   r0   r4   r     sz    
<
P












	
7Lr   r  r  r  write_c                       s   e Zd ZU dZ fddZedd Zedd Zee	d< 	 e
dd	 Zd
d Zdd Zdd Zdd Zdd Z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
    c                    s   t  j|i | d| _d S )NT)superrz   r   )rx   r   kwargs	__class__r0   r4   rz     s   
zImageFileDirectory_v1.__init__c                 C   r{   rj   )r   r   r0   r0   r4   r     r   zImageFileDirectory_v1.<lambda>c                 C   r{   rj   )r   r   r0   r0   r4   r     r   r   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]   )r^   r   r   r   )clsoriginalr|  r0   r0   r4   from_v2  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`

        r]   )r   r^   r   r   r   r   )rx   r|  r0   r0   r4   to_v2  s
   zImageFileDirectory_v1.to_v2c                 C   r   rj   )r   r   r   r0   r0   r4   r     r   z"ImageFileDirectory_v1.__contains__c                 C   r   rj   )r   r   r   r   r   r0   r0   r4   r     r   zImageFileDirectory_v1.__len__c                 C   r   rj   )r  r   r   r   r   r0   r0   r4   r    r   zImageFileDirectory_v1.__iter__c                 C   s   dD ]	}|  ||| qd S N)FT)r   )rx   r   ry   r   r0   r0   r4   r     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   rv   r   r   )rx   r   r   r   r   r   legacyre   r0   r0   r4   r     s   



z!ImageFileDirectory_v1.__getitem__)r   r   r   r   rz   r   tagstagdatar   __annotations__classmethodr  r  r   r   r  r   r   __classcell__r0   r0   r  r4   r    s   
 
r  c                       s   e Zd ZdZdZdZd fdd	Zdd Zed	d
 Z	dd Z
dd Zdd Zdd Z fddZdd Zdd Zdd Zdd Z  ZS )TiffImageFileTIFFz
Adobe TIFFFNc                    s"   d | _ 	 d | _	 t || d S rj   )tag_v2r   r  rz   )rx   ra  filenamer  r0   r4   rz     s
   zTiffImageFile.__init__c                 C   s   | j d}t|| _d| _| 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 filer%   Nra   z*** TiffImageFile._open ***z- __first: z- ifh: r   )ra  r_  r   r  r|  r   _TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_TiffImageFile__fp
_frame_pos	_n_framesro  rp  r   _seek)rx   r   r0   r0   r4   _open  s   

zTiffImageFile._openc                 C   sX   | j d u r)|  }| t| j | j d u r$| |  d  | j d u s| | | j S )Nr   )r  rk  r  r   r  rq  )rx   currentr0   r0   r4   n_frames&  s   



zTiffImageFile.n_framesc                 C   s<   |  |sdS | | t| j tj| j| j| _dS )z%Select a given frame as current imageN)	_seek_checkr  r   _decompression_bomb_checkr   corenewmodeimrx   framer0   r0   r4   rq  0  s
   

zTiffImageFile.seekc                 C   sH  | j | _| j  t| j|kr| jstdtd| d| j	 d| j d| j   | j
| j | j| j td| j   | j| j | jj| jv rWd| _n| jj| _| jdkrf|d | _t| jdkrs| jdk| _|  j	d7  _	t| j|ks| j
| j|  | j| j t| j | _| _|| _	|   d S )	Nzno more images in TIFF filezSeeking to frame z, on frame z	, __next z, location: zLoading tags, location: %sr   r   )r  ra  rk  r   r  r  EOFErrorro  rp  r  rq  r  r  r{  r   r  is_animatedr  r  r   r|  _setupr  r0   r0   r4   r  ;  s<   



zTiffImageFile._seekc                 C   r{   )zReturn the current frame number)r  r   r0   r0   r4   rk  _  r~   zTiffImageFile.tellc                 C   s   d| j v r| | j d S i S )z
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.
        :returns: XMP tags in a dictionary.
        r   )r  _getxmpr   r0   r0   r4   getxmpc  s   zTiffImageFile.getxmpc                    s   | j r
| jr
|  S t  S rj   )tileuse_load_libtiff_load_libtiffr  r{  r   r  r0   r4   r{  k  s   
zTiffImageFile.loadc                 C   s   | j r(tjtjtjtjtjtjtjd	| j }|d ur(| j
|| _
| j
j| _| jsId| _| j  |  }tj D ]}||vrCq<|| q<d S d S )N)r   r   r   r   r!   r#   r%   T)_tile_orientationr   FLIP_LEFT_RIGHT
ROTATE_180FLIP_TOP_BOTTOM	TRANSPOSE
ROTATE_270
TRANSVERSE	ROTATE_90rm  r  	transposer   _sizer  !_close_exclusive_fp_after_loadingra  rk  getexifr   TAGS_V2_GROUPSkeysget_ifd)rx   methodexifkeyr0   r0   r4   load_endp  s0   	

	zTiffImageFile.load_endc           	   
   C   s  t j |  |   t| jdkstd| jd d }t| jd d }zt| jdo3t	
| j }t| jdr?| j  W n tyK   d}Y nw |rR||d< t | jd	t|| j}z	|| j| W n tyx } ztd
|d}~ww | jo| j }t| jdrtd || j \}}n,|rtd |s| jd |d\}}ntd | jd || j \}}g | _d| _|   |r| j  d| _|dk rt|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   r{  load_preparer   r  r`  r  hasattrra  osdupr  r  _getdecoderr  r   decoderconfigsetimager  r  _exclusive_fpr  ro  rp  r=  r  rq  r_  readonlyr  close)	rx   extentsr   ra  decodereclose_self_fpnerrr0   r0   r4   r    s\   






zTiffImageFile._load_libtiffc              
   C   s  d| j v r	td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d  t| j t}t| j t}||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|krt|dkr|| }| j t| jdkr|dv rdnd}	t||	krtd| j j|||||f}
t
d|
  z	t|
 \| _}W n ty" } z
t
d td|d}~ww t
d|  t
d| j  | j| jd< | j td}| j t d}|r|r| j t!}|dkra||f| jd< n,|dkrr|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$r|dkr|
dd d |
dd  }
t
d|
  t|
 \| _}|d#krd$}d%|v r|%d%d&}d'|v r|%d'd&}|dkr| jd(kr| jdkrd)}|| jd*| j j&f}| j"'d+dd||fd|f nt(| j v st)| j v rt(| j v r1| j t( }| j t*|}| jd }n| j t) }| j d,}| j d-}|D ]h}|| |krV|t+| d. }nd}|}| jdkrh|| }|| }|t|df}| j"'| j||t|| |t|| |f||f || }|| jd krd|| }}|| jd krd }}|d7 }qDn	t
d/ tdt,| j v r| j t, | jd0< | jd1v rd2d3 | j t- D }t./d4d50|| _1| j d6| _2dS )7z-Setup this image object based on current tagsi  z+Windows Media Photo files not yet supportedr   r   r"   r!   z*** Summary ***z- compression: z- photometric_interpretation: z- planar_configuration: z- fill_order: z- YCbCr subsampling: r   z- size: r6   r0   )r   r!   r%   r   r   r   )r   r!   zunknown data organizationzformat key: z- unsupported formatzunknown pixel modeNz- raw mode: z- pil mode: compressionr   dpigRQ@
resolutionr   r:   I;16Nz;16Bz;16Nz;16Lr$   rG   Fr  r   r   r%   z- unsupported data organizationicc_profilerS   rT   c                 S   s   g | ]}t |d  qS )r   r   )r1   r1  r0   r0   r4   r     s    z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr&  i  )3r  r`  COMPRESSION_INFOrm  COMPRESSION_compressionPLANAR_CONFIGURATION_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERro  rp  r   r   
IMAGEWIDTHIMAGELENGTHr  r   SAMPLEFORMATr   rn   rm   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELr   r^   	OPEN_INFOr  rn  r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  r   rz  r  r~  TILEOFFSETSROWSPERSTRIPsum
ICCPROFILECOLORMAPr
   r   r(  paletter  )rx   photo	fillorderxsizeysizesampleFormat	bps_tupleextra_tuple	bps_countsamplesPerPixelr  rawmoder  xresyresresunitxylayerr}   offsetsr2  wrz  stridetile_rawmoder  r0   r0   r4   r    s   



,












zTiffImageFile._setupc                 C   sP   z#z| j | jkr| j   W n	 ty   Y nw W d | _ d S W d | _ d S d | _ w rj   )r  ra  r  AttributeErrorr   r0   r0   r4   
_close__fp  s   

zTiffImageFile._close__fp)NN)r   r   r   formatformat_descriptionr  rz   r  r   r  rq  r  rk  r  r{  r  r  r  r  r  r0   r0   r  r4   r    s$    	
	$U Qr  r7   r8   rF   rS   rT   r=   rD   r:   r>   rA   rB   rG   rJ   rH   rU   YCbCrrX   rE   r<   r?   rC   )r?   rC   c           .      C   sr  zt | j \}}}}}}W n ty# }	 z
td| j d|	d }	~	ww t|d}
| j}| j}|d| jd}|d u r@d}n|dkrGd}n|dkrMd	}t	pR|dk}t
| d
d|
t< | jd |
t< | jd |
t< d|v rr|d }nd|v r|d }t|trt }|| |}ni }tdt|  t|tr| }|D ]1}t|tjr|tj v r|||
|< n|||
|< z
|j| |
j|< W q ty   Y qw t| drt t!t"t#t$t%fD ]}|| j&v r| j&| |
|< | j&j| |
j|< q|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t*dft+dft,dff
D ]\}}||v r8|| |
|< q)|d}|rRd|
t < |d |
t!< |d |
t"< |dkrh||
t-< t.|dkrht.||
t/< |d urq||
t0< |dkrz||
t1< t2|
vr||
t2< nF| jdv r|
t2 dkr| jdkr| 3 }| }t4|j5D ]}t4|j6D ]}|||f d krdnd |||f< qq|} nt78| } | jd!v r| j9:d"d#}t;d$d% |D |
t<< t.|| jd |d  d& d'  }|r|dkrdn	t=t>| | jd }|dkrt=|d& d' d' | jd }n| jd }|dkr'd}|dkr.dn|| }| jd | d | }||
t?< |d(krLtj@|
jtA< |f|d  || jd  ||d   f |
tA< t;t4d|| ||
tB< tC|d|
tD< | jd)krtEd*tFd+iG D ]\}}|
H|| qtItJtKtLg} |rd,|v r|d, }!t|!tMr|!dk s|!d-krtNd.|dkrtNd/|!|
tO< td0 td1tP|
G   d}"t|d2rz|Qd tRS|T }"W n tUjVy   Y nw i }#| tFtAtBtWtXg7 } i }$|d |$t-< i }%t| d3r| jY }%i t
| di |%}&t1|&v r(|&t1= tZ[|
G |&G D ]g\}}|tj\vrjtj]j^sCq2||
jv rQ|
j| |#|< nt|tMt_t`tfs]q2ta|jb}'|'rj|'|#|< ||$vr|| vrt|t`r|cd4d5d6 |$|< q2t|tdrt_||$|< q2||$|< q2t1|$v rt.|$t1 dkr|$t1 d |$t1< td7tP|$G   | jd8v rd9}t|$G }(|(e  |||"||(|#f})tf| jd:|)|}	|	g| j9d;| j  	 |	cd=\}*}+},|"s|h|, |+rnq|+dk rtd>|+ d?n | D ]}|
|= q|
i|}-tjk| |dd;| j |-||dffg d@|v r7|
| _ld S d S )ANzcannot write mode z as TIFFr]   r  r   r"   r$   r*   r&   r  r   r   tiffinfor  zTiffinfo Keys: %sr  r  descriptionr  x_resolutiony_resolutionresolution_unitsoftware	date_timeartist	copyrightr  r   r6   )r7   r8   r7      r  rG   r  c                 s   s    | ]}|d  V  qdS )r   Nr0   r   r0   r0   r4   r   U  r   z_save.<locals>.<genexpr>r#   r%   r   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  r   r   r   r;  zConverted items: %s)r<   r:   r  r  rK   Ti @  zencoder error z when writing image file_debug_multipage)m	SAVE_INFOr  rn  r`  r   encoderinfoencoderconfigrm  r   WRITE_LIBTIFFr   r  r   r  r  rv   r   r   Exifr{  ro  rp  r  r  r  r   r  r  r  r   r   r  r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKXMPr  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  r   r  r  r  r  copyrl  heightwidthr	   invertr  
getpaletter   r  rm   
STRIP_SIZEr  r  STRIPBYTECOUNTSr~  COMPRESSION_INFO_REVr  YCBCRSUBSAMPLINGREFERENCEBLACKWHITEr   
setdefault	TILEWIDTH
TILELENGTHr  TILEBYTECOUNTSr   r  JPEGQUALITYr}  rq  r  r  r  ioUnsupportedOperationTRANSFERFUNCTIONSUBIFDr   	itertoolschainLIBTIFF_COREr  libtiff_support_custom_tagsrw   r   r   r   r   rc   sort_getencoderr  r  r  r   _saver-  ).r  ra  r  r  r^   r  r  bitsextrar  r|  r/  r0  r  r  r   r  r  iccr   r  inverted_impxr  r  lutr  rows_per_stripstrip_byte_countsstrips_per_imager   ry   	blocklistr+  _fptypesatts
legacy_ifdsupplied_tagsr   r  r}   r3  sr4  rz  r0   r0   r4   rT    s  













&
""






 











rT  c                   @   s   e Zd Zg dZh dZd1ddZdd Zdd	 Zd
d Zdd Z	dd Z
dd ZejfddZdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd2d.d/Zd0S )3AppendingTiffWriter)r   r   r   r   r   r%   r   r   r   r   r%   r   r%   >       	     r   r   Fc                 C   st   t |dr|| _d| _n"|| _d| _zt||rdnd| _W n ty-   t|d| _Y nw | j | _|   d S )Nr_  FTzw+bzr+b)	r  r   close_fpr   openr`  rk  	beginningsetup)rx   fnr  r0   r0   r4   rz     s   
zAppendingTiffWriter.__init__c                 C   s   | j | jtj d | _d| _| j d | _}|sd| _	d S d| _	|dkr,| 
d n|dkr6| 
d ntd	|   |   d S )
Nr   r   TFrZ   r   rY   r   zInvalid TIFF file header)r   rq  rl  r  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPager_  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)rx   rr  r0   r0   r4   rm    s   zAppendingTiffWriter.setupc                 C   s   | j rd S | j| j | jd}|sd S || jkrtd|  }|| j7 }| j| j | 	| | j| | 
  d S )Nr   z1IIMM of new page doesn't match IIMM of first page)rs  r   rq  rq  r_  rr  ru  readLongrp  	writeLongfixIFD)rx   rr  	IFDoffsetr0   r0   r4   finalize2  s   


zAppendingTiffWriter.finalizec                 C   s   |    |   d S rj   )r|  rm  r   r0   r0   r4   newFrameI  s   zAppendingTiffWriter.newFramec                 C   s   | S rj   r0   r   r0   r0   r4   	__enter__N  s   zAppendingTiffWriter.__enter__c                 C   s   | j r|   dS )NF)rj  r  )rx   exc_type	exc_value	tracebackr0   r0   r4   __exit__Q  s   zAppendingTiffWriter.__exit__c                 C   s   | j  | j S rj   )r   rk  rq  r   r0   r0   r4   rk  V  r`   zAppendingTiffWriter.tellc                 C   s*   |t jkr
|| j7 }| j|| |  S rj   )r  ro  rq  r   rq  rk  )rx   rz  whencer0   r0   r4   rq  Y  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   rq  r  SEEK_ENDrk  r  r   rq  )rx   pospadBytesr0   r0   r4   rw  `  s   
zAppendingTiffWriter.goToEndc                 C   s.   || _ | j d | _| j d | _| j d | _d S )Nr8   r.  HHL)endianlongFmtshortFmt	tagFormat)rx   r  r0   r0   r4   rt  j  s   zAppendingTiffWriter.setEndianc                 C   sP   	 |   }|dkr| j d | _d S | j| |  }| j|d tj q)NTr   r   r9   )rx  r   rk  rp  rq  	readShortr  SEEK_CUR)rx   r{  numTagsr0   r0   r4   rv  p  s   zAppendingTiffWriter.skipIFDsc                 C   s   | j |S rj   )r   r  r9  r0   r0   r4   r  {  r   zAppendingTiffWriter.writec                 C      t | j| jd\}|S )Nr   )r  r  r  r   r_  r   r0   r0   r4   r  ~     zAppendingTiffWriter.readShortc                 C   r  r[   )r  r  r  r   r_  r   r0   r0   r4   rx    r  zAppendingTiffWriter.readLongc                 C   N   | j dtj | j t| j|}|d ur#|dkr%td| dd S d S )Nr   wrote only  bytes but wanted 4	r   rq  r  r  r  r  r  r  ru  rx   ry   bytesWrittenr0   r0   r4   rewriteLastShortToLong  
   z*AppendingTiffWriter.rewriteLastShortToLongc                 C   r  )Nr  r   r   bytes but wanted 2)	r   rq  r  r  r  r  r  r  ru  r  r0   r0   r4   rewriteLastShort  r  z$AppendingTiffWriter.rewriteLastShortc                 C   r  )Nr   r  r  r  r  r0   r0   r4   rewriteLastLong  r  z#AppendingTiffWriter.rewriteLastLongc                 C   >   | j t| j|}|d ur|dkrtd| dd S d S )Nr   r  r  )r   r  r  r  r  ru  r  r0   r0   r4   
writeShort     zAppendingTiffWriter.writeShortc                 C   r  )Nr   r  r  )r   r  r  r  r  ru  r  r0   r0   r4   ry    r  zAppendingTiffWriter.writeLongc                 C   s   |    | j  d S rj   )r|  r   r  r   r0   r0   r4   r    s   zAppendingTiffWriter.closec                 C   s   |   }t|D ]u}t| j| jd\}}}| j| }|| }|dk}|s5|  }	|	| j	7 }	| 
|	 || jv rs| j }
|rV| j||dk|dkd | j|
d  n| j|	 | j||dk|dkd | j|
 d  }	}
q|r}| jdtj qd S )Nr%   r   r   )isShortisLong)r  rl  r  r  r  r   r_  
fieldSizesrx  rq  r  Tagsrk  
fixOffsetsrq  r  r  )rx   r  rs  r   	fieldTypert  	fieldSize	totalSizeisLocalrz  curPosr0   r0   r4   rz    s6   





zAppendingTiffWriter.fixIFDc                 C   s   |s|st dt|D ]H}|r|  n|  }|| j7 }|rG|dkrG|dkr+t d| | | jdtj	 | 
tj | jdtj	 q|rO| | q| | qd S )Nz offset is neither short nor longr   r   znot implementedir%   )ru  rl  r  rx  rq  r  r   rq  r  r  r  r   r  r  r  )rx   rt  r  r  rs  rz  r0   r0   r4   r    s    

zAppendingTiffWriter.fixOffsetsN)F)FF)r   r   r   r  r  rz   rm  r|  r}  r~  r  rk  rJ  ro  rq  rw  rt  rv  r  r  rx  r  r  r  r  ry  r  rz  r  r0   r0   r0   r4   re    s2    

#re  c              	   C   s   | j  }| j}t|dg }t| ds|st| ||S |  }zWt|;}| g| D ]-}||_ ||_t|ds<d}	n|j	}	t
|	D ]}
||
 |  t||| |  qCq,W d    n1 sdw   Y  W | | d S W | | d S | | w )Nappend_imagesr  r   )r/  r;  r0  r  rm  r  rT  rk  re  r  rl  rq  r{  r}  )r  ra  r  r/  r0  r  cur_idxtfimsnfrr  r0   r0   r4   	_save_all  s2   




r  z.tifz.tiffz
image/tiff)drJ  rN  loggingr  r  r  collections.abcr   	fractionsr   numbersr   r    r   r   r	   r
   r   _binaryr   r   	getLoggerr   ro  r   r1  IFD_LEGACY_APIr@  r   r   r  r  r  r  r  r  r6  r~  r  r  rA  r  r  r  r  rL  r7  r8  r9  	PREDICTORr  rF  rG  r  rH  rM  r  r  
JPEGTABLESrC  rD  r:  r3  r4  r  EXIFIFDr5  rI  IMAGEJ_META_DATA_BYTE_COUNTSIMAGEJ_META_DATAr  r   rB  r  r\   r_   ri   rq   r   r   rc   r   r  r   r   setattrr  ImageFileDirectoryr  r.  rT  re  r  register_openr  register_saveregister_save_allregister_extensionsregister_mimer0   r0   r0   r4   <module>   s  (
	
	
 !"#$%&'()*+,-./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v   o\   J	
   o