a
    xdJ                    @   s
  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@d0ZAd1ZBd2ZCd3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDZDdEdF eDE D ZFed dGddGdHfdIed dGddGdHfdIed dGdJdGdHfdKed dGdJdGdHfdKeddGddGdHfdLeddGddGdHfdLeddGdJdGdHfdMeddGdJdGdHfdMed dGddNdHfdOed dGddNdHfdOed dGdJdNdHfdPed dGdJdNdHfdPeddGddNdHfdQeddGddNdHfdQeddGdJdNdHfdReddGdJdNdHfdRed dGddSdHfdTed dGddSdHfdTed dGdJdSdHfdUed dGdJdSdHfdUeddGddSdHfdVeddGddSdHfdVeddGdJdSdHfdWeddGdJdSdHfdWed dGddXdHfdYed dGddXdHfdYed dGdJdXdHfdZed dGdJdXdHfdZeddGddXdHfd[eddGddXdHfd[eddGdJdXdHfd\eddGdJdXdHfd\eddGdd]dHfd^eddGdd_dHfd`eddGdd_dHfdaeddNdd_dHfdbeddNdd_dHfdced ddddedHfdfed ddddedHfdgeddGddedHfdheddNddedHfdieddNddedHfdjedddddedHfdfedddddedHfdgeddGddkdNfdleddGddkdNfdledJdGddmdHfdnedJdGddmdHfdnedJdGdJdmdHfdoedJdGdJdmdHfdoedJdGddpdHfdqedJdGddpdHfdqedJdGddpdrfdsedJdGddpdrfdsedJdGddtdufdvedJdGddtdufdvedJdGddwdxfdyedJdGddwdxfdyedJdGddpdGfdzedJdGddpdGfdzedJdGddtd{fd|edJdGddtd{fd|edJdGddwd}fd~edJdGddwd}fd~edJdGddpdNfdqedJdGddpdNfdqedJdGddtdfdedJdGddtdfdedJdGddwdfdedJdGddwdfdedJdGddpdfdqedJdGddpdfdqedJdGdddHfdedJdGdddHfdedJdGdddHfdedJdGdddHfdedJdGdddrfdedJdGdddrfdedJdGdddGfdedJdGdddGfdedJdGdddNfdedJdGdddNfdeddGddGdHfdeddGddGdHfdeddGdJdGdHfdeddGdJdGdHfdeddGddNdHfdeddGddNdHfdeddGdJdNdHfdeddGdJdNdHfdeddGddSdHfdeddGddSdHfdeddGdJdSdHfdeddGdJdSdHfdeddGddXdHfdeddGddXdHfdeddGddkdNfdeddGddkdNfdeddGdJdXdHfdeddGdJdXdHfdeddGddpdHfdeddGddpdHfdeddGddtdrfdeddGddtdrfdeddGddwdufdeddGddwdufdeddGdddHfdeddGddmdHfdeddGddmdHfdeddGddmdHfdeddGddmdHfdioZGg dZHdd ZIdd ZJdd ZKi ZLi ZMG dd deZNG dd deZOeLeO_LeMeO_MeE D ]B\ZPZQeQRddZQeSeOdeQ eLeP d  eSeOdeQ eMeP  q[L[M[P[QG dd deOZTeTZUG dd dejZVdedddGdfdedddXdfdedddkdJfdedddXdfdedddkdJfdeddJdedfdeddd_dfdeddJd_dfdedddedfdedJddmdfdedJddpd fdedJddpdJfdedddpdfdedddmdfdedddmdfdeddJdedfdeddd_dfdeddJd_dfdedddedfdǜZWddɄ ZXG dd˄ d˃ZYdd̈́ ZZe[eVj\eVeI e]eVj\eX e^eVj\eZ e_eVj\ddg e`eVj\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@  D  iJ  iR  iS  i[    i  i  i  iI  is  ii    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  r#   ).0kvr#   r#   K/var/www/html/Ranjet/env/lib/python3.9/site-packages/PIL/TiffImagePlugin.py
<dictcomp>       r(   r   r#   )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)r"   )r,   zL;I)r,   zL;IR)r,   r,   )r,   zL;R)   )I;16zI;12)   )r.   r.   )I;16Br0   )II;16S)r1   I;16BS)r   )    )FF;32F)r5   F;32BF)r1   zI;32N)r1   I;32S)r1   I;32BS)r"   r"   )LAr:   )r"   r"   r"   )RGBr;   )r;   zRGB;R)r"   r"   r"   r"   )RGBAr<   )r   )RGBXr=   )r"   r"   r"   r"   r"   r   r   )r=   ZRGBXX)r"   r"   r"   r"   r"   r"   )r   r   r   )r=   ZRGBXXX)r<   ZRGBa)r   r   )r<   ZRGBaX)r   r   r   )r<   ZRGBaXX)r   r   )r<   ZRGBAX)r   r   r   )r<   ZRGBAXX)i  )r/   r/   r/   )r;   zRGB;16L)r;   zRGB;16B)r/   r/   r/   r/   )r<   zRGBA;16L)r<   zRGBA;16B)r=   zRGBX;16L)r=   zRGBX;16B)r<   zRGBa;16L)r<   zRGBa;16Br   )PzP;1)r?   zP;1R)r?   zP;2)r?   zP;2R)r?   zP;4)r?   zP;4R)r?   r?   )PAr@   )r?   zP;Rr   )CMYKrA   )rA   ZCMYKX)rA   ZCMYKXX)rA   zCMYK;16Lr    )r;   r=   r"   )LABrB   )   MM *   II* s   MM* s   II *c                 C   s   | d d t v S Nr   )PREFIXESprefixr#   r#   r'   _accept  s    rI   c                 C   s<   t | dk}t|rd|  n| |}|r8|d d d S |S )Nr   )absIFDRationallimit_rational)valmax_valinvn_dr#   r#   r'   _limit_rational  s    rR   c                 C   sP   t | }|j|jf}t||k r.t| t|}t||krLt | } t| |}|S N)r   	numeratordenominatorminrR   rK   max)rN   rO   Zmin_valfracrQ   r#   r#   r'   _limit_signed_rational  s    
rY   c                   @   s>  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 )4rL   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rB|j| _|j| _n|| _|| _|dkrbtd| _n |dkrvt|| _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   )	
isinstancerL   rT   rZ   rU   r[   r\   r   float)selfvaluerU   r#   r#   r'   __init__1  s    


zIFDRational.__init__c                 C   s   | j S rS   )rZ   ar#   r#   r'   rT   K  s    zIFDRational.numeratorc                 C   s   | j S rS   )r[   rc   r#   r#   r'   rU   O  s    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   )rU   rT   r\   Zlimit_denominator)r`   Zmax_denominatorfr#   r#   r'   rM   S  s    
zIFDRational.limit_rationalc                 C   s   t t| jS rS   )strr_   r\   r`   r#   r#   r'   __repr__`  s    zIFDRational.__repr__c                 C   s
   | j  S rS   )r\   __hash__rg   r#   r#   r'   ri   c  s    zIFDRational.__hash__c                 C   s0   | j }t|tr|j }t|tr(t|}||kS rS   )r\   r^   rL   r_   )r`   otherrN   r#   r#   r'   __eq__f  s    

zIFDRational.__eq__c                 C   s   | j | j| jgS rS   )r\   rZ   r[   rg   r#   r#   r'   __getstate__n  s    zIFDRational.__getstate__c                 C   s,   t | d |\}}}|| _|| _|| _d S )Nr   )rL   rb   r\   rZ   r[   )r`   stater\   rZ   r[   r#   r#   r'   __setstate__q  s
    
zIFDRational.__setstate__c                    s    fdd}|S )Nc                    s   t | j | S rS   )getattrr\   )r`   argsopr#   r'   delegatey  s    z'IFDRational._delegate.<locals>.delegater#   )rr   rs   r#   rq   r'   	_delegatex  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__N)r   )*__name__
__module____qualname____doc__	__slots__rb   propertyrT   rU   rM   rh   ri   rk   rl   rn   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#   r#   r#   r'   rL   #  sP   


rL   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dadOdPZ,edNdQdR Z-dSdT Z.dUdV Z/dbdXdYZ0dZd[ Z1dS )c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r0|n
|dd | _| jtkrPd| _n| jtkrbd| _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 IFDr,   F)rF   SyntaxErrorrepr_prefixMM_endianIIgrouptagtypereset_unpacknext_legacy_api)r`   ifhrH   r   r#   r#   r'   rb     s    

zImageFileDirectory_v2.__init__c                 C   s   | j S rS   )r   rg   r#   r#   r'   <lambda>  r)   zImageFileDirectory_v2.<lambda>c                 C   s   | j S rS   )_offsetrg   r#   r#   r'   r     r)   c                 C   s   | j S rS   )r   rg   r#   r#   r'   r     r)   c                 C   s   t dd S )Nz"Not allowing setting of legacy api)	Exceptionr`   ra   r#   r#   r'   
legacy_api  s    z ImageFileDirectory_v2.legacy_apic                 C   s(   i | _ i | _i | _i | _d | _d | _d S rS   )_tags_v1_tags_v2_tagdatar   _nextr   rg   r#   r#   r'   r     s    zImageFileDirectory_v2.resetc                 C   s   t t| S rS   )rf   dictrg   r#   r#   r'   __str__
  s    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 r#   )r   lookupr   name)r$   codera   rg   r#   r'   r(     s   z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsrg   r#   rg   r'   named  s    
zImageFileDirectory_v2.namedc                 C   s   t t| jt| jB S rS   )lensetr   r   rg   r#   r#   r'   __len__  s    zImageFileDirectory_v2.__len__c                 C   sf   || j vr>| j| }| j| }| j| \}}|| || j| |< | j | }| jrbt|ttfsb|f}|S rS   )r   r   r   _load_dispatchr   r^   tuplebytes)r`   tagdatatypsizehandlerrN   r#   r#   r'   __getitem__  s    



z!ImageFileDirectory_v2.__getitem__c                 C   s   || j v p|| jv S rS   )r   r   r`   r   r#   r#   r'   __contains__&  s    z"ImageFileDirectory_v2.__contains__c                 C   s   |  ||| j d S rS   )_setitemr   )r`   r   ra   r#   r#   r'   __setitem__)  s    z!ImageFileDirectory_v2.__setitem__c              
      s  t ttf}t|| j t||r(|gn|}|| jvrp jrN j| j|< n"tj	| j|< t
dd |D rt
dd |D rtjntj| j|< nt
dd |D rt
dd |D rtj| j|< nDt
dd |D rtj| j|< n$t
dd |D rtjntj| j|< ndt
dd |D r.tj| j|< nBt
d	d |D rPtj| j|< n t
d
d |D rpt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}|s jdks@| j| tjks@ jd u rt|dkr|s|rd| j| tjtjfv rd|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 rS   )r^   rL   r$   r&   r#   r#   r'   	<genexpr>7  r)   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s   s   | ]}|d kV  qdS r   Nr#   r   r#   r#   r'   r   :  r)   c                 s   s   | ]}t |tV  qd S rS   )r^   intr   r#   r#   r'   r   =  r)   c                 s   s&   | ]}d |  kodk n  V  qdS )r   r   Nr#   r   r#   r#   r'   r   >  r)   c                 s   s&   | ]}d |  k odk n  V  qdS )i i   Nr#   r   r#   r#   r'   r   @  r)   c                 s   s   | ]}|d kV  qdS r   r#   r   r#   r#   r'   r   E  r)   c                 s   s   | ]}t |tV  qd S rS   )r^   r_   r   r#   r#   r'   r   H  r)   c                 s   s   | ]}t |tV  qd S rS   )r^   rf   r   r#   r#   r'   r   J  r)   c                 s   s   | ]}t |tV  qd S rS   )r^   r   r   r#   r#   r'   r   L  r)   c                 S   s&   g | ]}t |tr|d dn|qS )asciireplace)r^   rf   encoder   r#   r#   r'   
<listcomp>P  s   z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S   s"   g | ]}t |trt|n|qS r#   )r^   r   r_   r   r#   r#   r'   r   U  r)   c                 3   s   | ]}  |V  qd S rS   )Zcvt_enumr$   ra   infor#   r'   r   Y  r)   r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   r   rf   r   r   r   r^   r   type	UNDEFINEDallZRATIONALZSIGNED_RATIONALSHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr   r   r   r   lengthr   
ValueErrorwarningswarn)r`   r   ra   r   Z	basetypesvaluesis_ifddestr#   r   r'   r   ,  s~    



zImageFileDirectory_v2._setitemc                 C   s.   | j |d  | j|d  | j|d  d S rS   )r   popr   r   r   r#   r#   r'   __delitem__|  s    z!ImageFileDirectory_v2.__delitem__c                 C   s   t t| jt| jB S rS   )iterr   r   r   rg   r#   r#   r'   __iter__  s    zImageFileDirectory_v2.__iter__c                 C   s   t | j| |S rS   )structunpackr   )r`   fmtr   r#   r#   r'   r     s    zImageFileDirectory_v2._unpackc                 G   s   t j| j| g|R  S rS   )r   packr   )r`   r   r   r#   r#   r'   _pack  s    zImageFileDirectory_v2._packc                    s    fdd}|S )Nc                    sB   ddl m} | jdr2| jdd  dd| < | ft < | S )Nr   r   load_r   _ )r   r   r   
startswithr   r   )funcr   idxr   r#   r'   	decorator  s
    z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr#   )r   r   r   r#   r   r'   _register_loader  s    z&ImageFileDirectory_v2._register_loaderc                    s    fdd}|S )Nc                    s   | t  < | S rS   )_write_dispatch)r   r   r#   r'   r     s    z9ImageFileDirectory_v2._register_writer.<locals>.decoratorr#   )r   r   r#   r   r'   _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   |  dt|  |S )Nz{}{})r   formatr   r`   r   r   r   r   r#   r'   r     s    z7ImageFileDirectory_v2._register_basic.<locals>.<lambda>c                    s   d  fdd|D S )Nr)   c                 3   s   | ]}  |V  qd S rS   )r   r   )r   r`   r#   r'   r     r)   zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>joinr`   r   )r   rg   r'   r     s    )T)r   r   r   calcsizer   r   )Zidx_fmt_namer   r   r   r#   r   r'   _register_basic  s    
z%ImageFileDirectory_v2._register_basicHshortr,   longbzsigned bytehzsigned shortlzsigned longre   r_   ddoubler   Tc                 C   s   |S rS   r#   r   r#   r#   r'   	load_byte  s    zImageFileDirectory_v2.load_bytec                 C   s   |S rS   r#   r`   r   r#   r#   r'   
write_byte  s    z ImageFileDirectory_v2.write_byter   c                 C   s"   | dr|d d }|ddS )N    rJ   zlatin-1r   )endswithdecoder   r#   r#   r'   load_string  s    
z!ImageFileDirectory_v2.load_stringc                 C   s   d| dd d S )Nr)   r   r   r  )r   r   r#   r#   r'   write_string  s    z"ImageFileDirectory_v2.write_stringr   r"   c                    sV   |  dt|d |}fdd t fddt|d d d |dd d D S )	Nz{}Lr   c                    s    r| |fS t | |S rS   rL   rd   r  r   r#   r'   combine  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3   s   | ]\}} ||V  qd S rS   r#   r$   numZdenomr  r#   r'   r     r)   z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   r   r   r   r   zipr`   r   r   valsr#   r  r   r'   load_rational  s    z#ImageFileDirectory_v2.load_rationalc                    s   d  fdd|D S )Nr)   c                 3   s&   | ]} j d gt|dR  V  qdS )Z2Ll    N)r   rR   r$   rX   rg   r#   r'   r     s   z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r   r   r#   rg   r'   write_rational  s    z$ImageFileDirectory_v2.write_rationalr!   c                 C   s   |S rS   r#   r   r#   r#   r'   load_undefined  s    z$ImageFileDirectory_v2.load_undefinedc                 C   s   |S rS   r#   r   r#   r#   r'   write_undefined  s    z%ImageFileDirectory_v2.write_undefined
   c                    sV   |  dt|d |}fdd t fddt|d d d |dd d D S )	Nz{}lr   c                    s    r| |fS t | |S rS   r  r  r  r#   r'   r    s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3   s   | ]\}} ||V  qd S rS   r#   r  r  r#   r'   r     r)   z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   r  r  r#   r  r'   load_signed_rational  s    z*ImageFileDirectory_v2.load_signed_rationalc                    s   d  fdd|D S )Nr)   c                 3   s(   | ] } j d gt|ddR  V  qdS )Z2lii   N)r   rY   r  rg   r#   r'   r     s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r   r   r#   rg   r'   write_signed_rational  s    z+ImageFileDirectory_v2.write_signed_rationalc                 C   s4   | |}t||kr0td| dt| d|S )Nz&Corrupt EXIF data.  Expecting to read  bytes but only got z. )readr   OSError)r`   fpr   retr#   r#   r'   _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y   t|	d|   Y q2Y n0 ||
 }|dkr*| }| d|\}|	d| d| 7 }	|| t||}|| n|d | }t||krptd| dt| d|  t|	 q2|st|	 q2|| j|< || j|< |	d|dkrd| nt| 7 }	t|	 q2| d| |d\| _W n6 ty }	 ztt|	 W Y d }	~	d S d }	~	0 0 d S )Nr   r   r   HHL4sr-   unknownztag:  (
) - type: )z - unsupported type r   r,   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r$  z. Skipping tag 
 - value: r4   <table: %d bytes>)r   tellr   ranger   r)  r   r   r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readr   r   r   r   r   r   r   r&  rf   )r`   r'  ir   r   countr   tagnametypnamemsgZ	unit_sizer   r   hereoffsetr#   r#   r'   load  s^    
"






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ot|t}|r| jdkrd}	nd	}	t|	|d
}
| j| }| D ]\}}||
|< q|
|}n,t|tr|n|f}| j| | g|R  }t|| jj}|r:d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 qF|||||  d||f |t|d d d 7 }qF|d ur|| \}}}}}|rXtd|  d| d|d | }|||||f||< |D ]T\}}}}}t	| d| d| dt
| dt
| 	 ||  d||||7 }q|d7 }|D ].\}}}}}||7 }t|d@ r|d7 }q|S )Nr   r-   r   zTag z, Type: z	, Value: r   s   II*    s   MM *   )r   ifdr+  zsave: r,  r-  r.  r/  r/   r0  r   r  r)   r,   r   z&multistrip support not yet implementedr   r   r*  s       ) r   r   r   sortedr   STRIPOFFSETSr   r3  r5  r6  r   r   r   r^   r   r   r   tobytesr   r   r   r   r   r   rf   r   r   r   appendljustNotImplementedErrorr   )r`   r?  resultentriesZstripoffsetsr   ra   r   r   r   rA  r   Zifd_tagZ	ifd_valuer   r;  r<  r=  r:  r#   r#   r'   rD  6  sh     


 


.zImageFileDirectory_v2.tobytesc                 C   sN   |  dkr&|| j| ddd  |  }| |}|| |t| S )Nr   ZHL*   r"   )r1  writer   r   rD  r   )r`   r'  r?  rH  r#   r#   r'   save  s    

zImageFileDirectory_v2.save)r   NN)T)T)T)T)T)r   )2r   r   r   r   rb   r   rH   r?  r   setterr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   listmapr   r   r   ZSIGNED_BYTEr   r   FLOATr   ZIFDr  r
  r  r  r  r  r  r   r"  r#  r)  r@  rD  rL  r#   r#   r#   r'   r     sx   <

P












	7
Lr   r   r   r   Z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)superrb   r   )r`   rp   kwargs	__class__r#   r'   rb     s    zImageFileDirectory_v1.__init__c                 C   s   | j S rS   )r   rg   r#   r#   r'   r     r)   zImageFileDirectory_v1.<lambda>c                 C   s   | j S rS   )r   rg   r#   r#   r'   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`

        rG   )rH   r   r   r   )clsoriginalrA  r#   r#   r'   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`

        rG   )r   rH   r   r   r   r   )r`   rA  r#   r#   r'   to_v2  s
    zImageFileDirectory_v1.to_v2c                 C   s   || j v p|| jv S rS   )r   r   r   r#   r#   r'   r     s    z"ImageFileDirectory_v1.__contains__c                 C   s   t t| jt| jB S rS   )r   r   r   r   rg   r#   r#   r'   r     s    zImageFileDirectory_v1.__len__c                 C   s   t t| jt| jB S rS   )r   r   r   r   rg   r#   r#   r'   r     s    zImageFileDirectory_v1.__iter__c                 C   s   dD ]}|  ||| qd S N)FT)r   )r`   r   ra   r   r#   r#   r'   r     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 rZ  )r   r   r   r   r   r^   r   r   )r`   r   r   r   r   r   legacyrN   r#   r#   r'   r     s    



z!ImageFileDirectory_v1.__getitem__)r   r   r   r   rb   r   tagsZtagdatar   __annotations__classmethodrX  rY  r   r   r   r   r   __classcell__r#   r#   rT  r'   rQ    s   

rQ  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 )TiffImageFileZTIFFz
Adobe TIFFFNc                    s   d | _ d | _t || d S rS   )tag_v2r   rR  rb   )r`   r'  filenamerT  r#   r'   rb     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"   NrJ   z*** TiffImageFile._open ***z- __first: z- ifh: r   )r'  r%  r   ra  rA  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_TiffImageFile__fp
_frame_pos	_n_framesr5  r6  r   _seek)r`   r   r#   r#   r'   _open
  s    

zTiffImageFile._openc                 C   sP   | j d u rJ|  }| t| j | j d u r@| |  d  q"| | | j S )Nr   )rg  r1  rh  r   rf  r7  )r`   currentr#   r#   r'   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)	Z_seek_checkrh  r   Z_decompression_bomb_checkr   corenewmodeimr`   framer#   r#   r'   r7  -  s
    

zTiffImageFile.seekc                 C   s<  | 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 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 | _| _|| _	|   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   )re  r'  r1  r   rf  rc  EOFErrorr5  r6  rd  r7  rE  ra  r@  r   rg  is_animatedrQ  rX  r   rA  _setuprp  r#   r#   r'   rh  8  s:    



zTiffImageFile._seekc                 C   s   | j S )zReturn the current frame number)rd  rg   r#   r#   r'   r1  \  s    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   )ra  Z_getxmprg   r#   r#   r'   getxmp`  s    zTiffImageFile.getxmpc                    s   | j r| jr|  S t  S rS   )tileuse_load_libtiff_load_libtiffrR  r@  rg   rT  r#   r'   r@  h  s    zTiffImageFile.loadc                 C   s   | j rPtjtjtjtjtjtjtjd	| j }|d urP| j
|| _
| j
j| _| jsd| _| j  |  }tj D ]}||vrqx|| qxd S )N)r   r   r   r   r    r!   r"   T)_tile_orientationr   ZFLIP_LEFT_RIGHTZ
ROTATE_180ZFLIP_TOP_BOTTOMZ	TRANSPOSEZ
ROTATE_270Z
TRANSVERSEZ	ROTATE_90r3  ro  Z	transposer   _sizers  !_close_exclusive_fp_after_loadingr'  r1  Zgetexifr   TAGS_V2_GROUPSkeysget_ifd)r`   methodexifkeyr#   r#   r'   load_endm  s,    	

zTiffImageFile.load_endc           	   
   C   s  t j |  |   t| jdks*td| jd d }t| jd d }z6t| jdoft	
| j }t| jdr~| j  W n ty   d}Y n0 |r||d< t | jd	t|| j}z|| j| W n. ty } ztd
|W Y d}~n
d}~0 0 | jo| j }t| jdr<td || j \}}n\|rnt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@  Zload_preparer   rv  r&  rN  hasattrr'  osdupr  r  Z_getdecoderrn  r   Zdecoderconfigsetimagero  r   Z_exclusive_fprs  r5  r6  r  r  r7  r%  readonlyr  close)	r`   Zextentsrp   r'  decodereZclose_self_fpnerrr#   r#   r'   rx    sT    
 





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rRd}| 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rFt|t|  kr>dkrFn nd}| j td}| j td}|dv rrd}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yd } z t
d td|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#pZ| 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r
d)}|| jd*| j j&f}| j"'d+dd||fd|f nTt(| j v sTt)| j v r~t(| j v r| j t( }| j t*|}| jd }n"| j t) }| j d,}| j d-}|D ]}|| |kr|t+| d. }nd}|}| jdkr|| }|| }|t|df}| j"'| j||t|| |t|| |f||f || }|| jd krd||  }}|| jd krd }}|d7 }qn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: r*   r#   )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   r;   Fr  iB  iC  r"   z- unsupported data organizationicc_profiler?   r@   c                 S   s   g | ]}t |d  qS )r   r   )r$   r  r#   r#   r'   r     r)   z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr)   i  )3ra  r&  COMPRESSION_INFOr3  COMPRESSION_compressionPLANAR_CONFIGURATION_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERr5  r6  r   r   
IMAGEWIDTHIMAGELENGTHrz  r   SAMPLEFORMATr   rW   rV   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELr   rH   	OPEN_INFOrn  r4  r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITrv  READ_LIBTIFFrw  r   r?  rE  rC  TILEOFFSETSROWSPERSTRIPsum
ICCPROFILECOLORMAPr
   r   r   palettery  )r`   photoZ	fillorderZxsizeZysizeZsampleFormatZ	bps_tupleZextra_tupleZ	bps_countZsamplesPerPixelr  rawmoder  ZxresZyresZresunitxyZlayerrd   offsetsr  wr?  strideZtile_rawmoder  r#   r#   r'   rt    s    



2


 






 


zTiffImageFile._setupc                 C   sF   z8z| j | jkr| j   W n ty.   Y n0 W d | _ nd | _ 0 d S rS   )re  r'  r  AttributeErrorrg   r#   r#   r'   
_close__fp  s    zTiffImageFile._close__fp)NN)r   r   r   r   format_descriptionr{  rb   ri  r   rk  r7  rh  r1  ru  r@  r  rx  rt  r  r_  r#   r#   rT  r'   r`    s"   	
	$U Qr`  r+   r,   r:   r?   r@   r8   r.   r2   r6   r;   r=   r<   rA   YCbCrrB   r9   r0   r3   r7   )r+   r,   r:   r?   r@   r1   r.   r2   r5   r;   r=   r<   rA   r  rB   r9   r0   r3   r7   c           -      C   s,  zt | j \}}}}}}W n8 tyR }	 z td| j d|	W Y d }	~	n
d }	~	0 0 t|d}
| j}| j}|d| jd}|d u rd}n|dkrd}n|dkrd	}t	p|dk}t
| d
d|
t< | jd |
t< | jd |
t< d|v r|d }n:d|v r&|d }t|tr*t }|| |}ni }tdt|  t|trP| }|D ]l}t|tjr|tj v r|||
|< n|||
|< z|j| |
j|< W n ty   Y n0 qTt| drt t!t"t#t$t%fD ]2}|| j&v r| j&| |
|< | j&j| |
j|< q|d| jd}|r4||
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 rt|| |
|< qt|d}|rd|
t < |d |
t!< |d |
t"< |dkr||
t-< t.|dkrt.||
t/< |d ur||
t0< |dkr||
t1< t2|
vr*||
t2< n| 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< qxqj|} n
t78| } | jd!v r| j9:d"d#}t;d$d% |D |
t<< t.|| jd |d  d& d'  }|rX|dkrdnt=t>| | jd }|dkrbt=|d& d' d' | jd }n
| jd }|dkrpd}|dkr~dn|| }| jd | d | }||
t?< |d(krtj@|
jtA< |f|d  || jd  ||d   f |
tA< t;t4d|| ||
tB< tC|d|
tD< | jd)krDtEd*tFd+iG D ]\}}|
H|| q,|rd,|v r|d, } t| tIr|| dk s|| d-krtJd.|dkrtJd/| |
tK< td0 td1tL|
G   d}!t|d2rz|Md tNO|P }!W n tQjRy    Y n0 i }"tFt1tAtBtStTg}#i }$|d |$t-< i }%t| d3r@| jU }%tVW|
G t
| di G |%G D ]\}}|tjXvrtjYjZsqb||
jv r|
j| |"|< n4t|tIt[t\tfsqbnt]|j^}&|&r|&|"|< ||$vrb||#vrbt|t\r
|_d4d5d6 |$|< n"t|t`r$t[||$|< n||$|< qbtd7tL|$G   | jd8v rVd9}t|$G }'|'a  |||!||'|"f}(tb| jd:|(|}	|	c| j9d;| j  |	_d<\})}*}+|!s|d|+ |*rqΐq|*dk rtd=|* d>n.|
e|},tfg| |dd;| j |,||dffg d?|v r(|
| _hd S )@Nzcannot write mode z as TIFFrG   r  r   r   r   r   r   r  r   r   Ztiffinfor  zTiffinfo Keys: %sra  r  descriptionr  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr  r   r*   )r+   r,   r+      r  r;   r  c                 s   s   | ]}|d  V  qdS )r   Nr#   r   r#   r#   r'   r   R  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)r0   r.   r  r  r>   i @  zencoder error z when writing image file_debug_multipage)i	SAVE_INFOrn  r4  r&  r   encoderinfoencoderconfigr3  r   WRITE_LIBTIFFro   r  r   r  r  r^   r   r   ZExifr@  r5  r6  rN  rQ  rY  r   r|  r}  r~  r   r   r  r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKXMPra  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  r   r  r  r  r  copyr2  heightwidthr	   invertro  Z
getpaletter   r  rV   
STRIP_SIZEr  r   STRIPBYTECOUNTSrC  COMPRESSION_INFO_REVr  YCBCRSUBSAMPLINGREFERENCEBLACKWHITEr   
setdefaultr   r   JPEGQUALITYrB  r7  r  r  r  ioUnsupportedOperationTRANSFERFUNCTIONSUBIFDr   	itertoolschainZLIBTIFF_CORErl  Zlibtiff_support_custom_tagsr_   rf   r   r   r   rL   sortZ_getencoderr  rK  rL  r   _saver  )-ro  r'  rb  r  rH   r  r   bitsextrar  rA  r  r  r  r  r   r  r  Ziccr   r  Zinverted_imZpxr  r  Zlutr  Zrows_per_stripZstrip_byte_countsZstrips_per_imager   ra   r  _fptypesZ	blocklistZattsZ
legacy_ifdr   r\  rd   r  sr  r?  r#   r#   r'   r    sz   *











*
""





 



	





r  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"   >   i   r   i  i  i	  r   Fc                 C   st   t |dr|| _d| _nD|| _d| _zt||r2dnd| _W n tyZ   t|d| _Y n0 | j | _|   d S )Nr%  FTzw+bzr+b)	r  re   close_fpr   openr&  r1  	beginningsetup)r`   fnrm  r#   r#   r'   rb     s    
zAppendingTiffWriter.__init__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td	|   |   d S )
Nr   r   TFrD   r   rC   r   zInvalid TIFF file header)re   r7  r  r  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPager%  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)r`   r  r#   r#   r'   r    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)r  re   r7  r  r%  r  r  readLongr  	writeLongfixIFD)r`   r  	IFDoffsetr#   r#   r'   finalize'  s    


zAppendingTiffWriter.finalizec                 C   s   |    |   d S rS   )r  r  rg   r#   r#   r'   newFrame>  s    zAppendingTiffWriter.newFramec                 C   s   | S rS   r#   rg   r#   r#   r'   	__enter__C  s    zAppendingTiffWriter.__enter__c                 C   s   | j r|   dS )NF)r  r  )r`   exc_type	exc_value	tracebackr#   r#   r'   __exit__F  s    zAppendingTiffWriter.__exit__c                 C   s   | j  | j S rS   )re   r1  r  rg   r#   r#   r'   r1  K  s    zAppendingTiffWriter.tellc                 C   s*   |t jkr|| j7 }| j|| |  S rS   )r  r  r  re   r7  r1  )r`   r?  whencer#   r#   r'   r7  N  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/   )re   r7  r  SEEK_ENDr1  rK  r   r  )r`   posZpadBytesr#   r#   r'   r  U  s    
zAppendingTiffWriter.goToEndc                 C   s.   || _ | j d | _| j d | _| j d | _d S )Nr,   r   ZHHL)endianlongFmtshortFmt	tagFormat)r`   r  r#   r#   r'   r  _  s    zAppendingTiffWriter.setEndianc                 C   sP   |   }|dkr"| j d | _qL| j| |  }| j|d tj q d S )Nr   r   r-   )r  re   r1  r  r7  	readShortr  SEEK_CUR)r`   r  numTagsr#   r#   r'   r  e  s    zAppendingTiffWriter.skipIFDsc                 C   s   | j |S rS   )re   rK  r	  r#   r#   r'   rK  p  s    zAppendingTiffWriter.writec                 C   s   t | j| jd\}|S )Nr   )r   r   r  re   r%  r   r#   r#   r'   r  s  s    zAppendingTiffWriter.readShortc                 C   s   t | j| jd\}|S rE   )r   r   r  re   r%  r   r#   r#   r'   r  w  s    zAppendingTiffWriter.readLongc                 C   sJ   | j dtj | j t| j|}|d urF|dkrFtd| dd S )Nr   wrote only  bytes but wanted 4	re   r7  r  r	  rK  r   r   r  r  r`   ra   ZbytesWrittenr#   r#   r'   rewriteLastShortToLong{  s    z*AppendingTiffWriter.rewriteLastShortToLongc                 C   sJ   | j dtj | j t| j|}|d urF|dkrFtd| dd S )Nr  r   r   bytes but wanted 2)	re   r7  r  r	  rK  r   r   r  r  r  r#   r#   r'   rewriteLastShort  s    z$AppendingTiffWriter.rewriteLastShortc                 C   sJ   | j dtj | j t| j|}|d urF|dkrFtd| dd S )Nr   r  r  r  r  r#   r#   r'   rewriteLastLong  s    z#AppendingTiffWriter.rewriteLastLongc                 C   s:   | j t| j|}|d ur6|dkr6td| dd S )Nr   r  r  )re   rK  r   r   r  r  r  r#   r#   r'   
writeShort  s    zAppendingTiffWriter.writeShortc                 C   s:   | j t| j|}|d ur6|dkr6td| dd S )Nr   r  r  )re   rK  r   r   r  r  r  r#   r#   r'   r    s    zAppendingTiffWriter.writeLongc                 C   s   |    | j  d S rS   )r  re   r  rg   r#   r#   r'   r    s    zAppendingTiffWriter.closec                 C   s   |   }t|D ]}t| j| jd\}}}| j| }|| }|dk}|sj|  }	|	| j	7 }	| 
|	 || jv r| j }
|r| j||dk|dkd | j|
d  n0| j|	 | j||dk|dkd | j|
 d  }	}
q|r| jdtj qd S )Nr"   r   r   )isShortisLong)r  r2  r   r   r  re   r%  
fieldSizesr  r  r  Tagsr1  
fixOffsetsr7  r  r	  )r`   r
  r9  r   Z	fieldTyper:  Z	fieldSizeZ	totalSizeZisLocalr?  ZcurPosr#   r#   r'   r    s2    





zAppendingTiffWriter.fixIFDc                 C   s   |s|st dt|D ]}|r(|  n|  }|| j7 }|r|dkr|dkrVt d| | | jdtj	 | 
tj | jdtj	 q|r| | q| | qd S )Nz offset is neither short nor longr   r   znot implementedir"   )r  r2  r  r  r  r  re   r7  r  r	  r  r   r   r  r  )r`   r:  r  r  r9  r?  r#   r#   r'   r    s    

zAppendingTiffWriter.fixOffsetsN)F)FF)r   r   r   r  r  rb   r  r  r  r  r   r1  r  r  r7  r  r  r  rK  r  r  r  r  r  r  r  r  r  r  r#   r#   r#   r'   r    s0   

#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_imagesrk  r   )r  r  r  rN  r3  r  r  r1  r  rk  r2  r7  r@  r  )ro  r'  rb  r  r  r  Zcur_idxtfZimsZnfrr   r#   r#   r'   	_save_all  s(    



,r  z.tifz.tiffz
image/tiff)ar  r  loggingr  r   r   collections.abcr   Z	fractionsr   Znumbersr   r    r   r   r	   r
   r   _binaryr   r   	getLoggerr   r5  r  r  ZIFD_LEGACY_APIr  r   r   r  r  r  r  r  r  r  rC  r  r  r  r  r  r  r  r  r  r  r  Z	PREDICTORr  r  r  r  r  Z
JPEGTABLESr  r  r  r  r  r  ZEXIFIFDr  r  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr  r   r  r  rF   rI   rR   rY   r   r   rL   r   r   r   r   setattrrQ  ZImageFileDirectoryr`  r  r  r  r  Zregister_openr   Zregister_saveZregister_save_allZregister_extensionsZregister_mimer#   r#   r#   r'   <module>)   s  
v   o\   M   o