B
    eAd,                @   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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 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Z0dZ1dZ2dZ3d Z4d!Z5d"Z6d#Z7d$Z8d%Z9d&Z:d'Z;d(Z<d)Z=d*Z>d+Z?d,Z@d-ZAd.ZBd/ZCd0ZDd1ZEd2ZFd3ZGd4ZHd5ZId6ZJd7ZKd8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIZLdJdK eLM D ZNe"d dLddLdMfdNe#d dLddLdMfdNe"d dLdOdLdMfdPe#d dLdOdLdMfdPe"ddLddLdMfdQe#ddLddLdMfdQe"ddLdOdLdMfdRe#ddLdOdLdMfdRe"d dLddSdMfdTe#d dLddSdMfdTe"d dLdOdSdMfdUe#d dLdOdSdMfdUe"ddLddSdMfdVe#ddLddSdMfdVe"ddLdOdSdMfdWe#ddLdOdSdMfdWe"d dLddXdMfdYe#d dLddXdMfdYe"d dLdOdXdMfdZe#d dLdOdXdMfdZe"ddLddXdMfd[e#ddLddXdMfd[e"ddLdOdXdMfd\e#ddLdOdXdMfd\e"d dLdd]dMfd^e#d dLdd]dMfd^e"d dLdOd]dMfd_e#d dLdOd]dMfd_e"ddLdd]dMfd`e#ddLdd]dMfd`e"ddLdOd]dMfdae#ddLdOd]dMfdae"ddLddbdMfdce"d dLddddMfdee"ddLddddMfdee#ddLddddMfdfe"ddLdOdddMfdge"ddSddddMfdhe#ddSddddMfdie"d djddkdMfdle#d djddkdMfdme"ddLddkdMfdne"ddSddkdMfdoe#ddSddkdMfdpe"ddjddkdMfdle#ddjddkdMfdme"ddLddqdSfdre#ddLddqdSfdre"dOdLddsdMfdte#dOdLddsdMfdte"dOdLdOdsdMfdue#dOdLdOdsdMfdue"dOdLddvdMfdwe#dOdLddvdMfdwe"dOdLddvdxfdye#dOdLddvdxfdye"dOdLddzd{fd|e#dOdLddzd{fd|e"dOdLdd}d~fde#dOdLdd}d~fde"dOdLddvdLfde#dOdLddvdLfde"dOdLddzdfde#dOdLddzdfde"dOdLdd}dfde#dOdLdd}dfde"dOdLddvdSfdwe#dOdLddvdSfdwe"dOdLddzdfde#dOdLddzdfde"dOdLdd}dfde#dOdLdd}dfde"dOdLddvdfdwe#dOdLddvdfdwe"dOdLdddMfde#dOdLdddMfde"dOdLdddMfde#dOdLdddMfde"dOdLdddxfde#dOdLdddxfde"dOdLdddLfde#dOdLdddLfde"dOdLdddSfde#dOdLdddSfde"ddLddLdMfde#ddLddLdMfde"ddLdOdLdMfde#ddLdOdLdMfde"ddLddSdMfde#ddLddSdMfde"ddLdOdSdMfde#ddLdOdSdMfde"ddLddXdMfde#ddLddXdMfde"ddLdOdXdMfde#ddLdOdXdMfde"ddLdd]dMfde#ddLdd]dMfde"ddLddqdSfde#ddLddqdSfde"ddLdOd]dMfde#ddLdOd]dMfde"ddLddvdMfde#ddLddvdMfde"ddLddzdxfde#ddLddzdxfde"ddLdd}d{fde#ddLdd}d{fde"ddLdddMfde"ddLddsdMfde#ddLddsdMfde"ddLddsdMfde#ddLddsdMfdiqZOePdd eOD ZQddddddgZRdd ZSdd ZTdd ZUi ZVi ZWG dd deZXG dd deZYeVeY_VeWeY_WxNeM D ]B\ZZZ[e[\ddZ[e]eYde[ eVeZ d  e]eYde[ eWeZ  	q4W [V[W[Z[[G dd deYZ^e^Z_G dd dejZ`de"dddLdfde"ddd]dfde"dddqdOfde"ddd]dfde"dddqdOfde"ddOdkdfde"dddddfde"ddOdddfde"dddkdfde"dOddsdfde"dOddvd fde"dOddvdOfde"dddvdfde"dddsdfde"dddsdfde#ddOdkdfde#dddddfde#ddOdddfde#dddkdfdԜZaddք ZbG dd؄ d؃Zcddڄ Zdeee`jfe`eS ege`jfeb ehe`jfed eie`jfddg eje`jfdݡ dS )    N)MutableMapping)Fraction)NumberRational   )Image	ImageFileImageOpsImagePaletteTiffTags)i16be)i32be)o8)TYPESFTi   s   IIs   MM   i  i  i  i  i
  i  i  i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  iB  iC  iD  iE  iJ  iR  iS  i[  i  i  i  i  iI  is  ii  i  i  i  i  rawZ
tiff_ccittZgroup3Zgroup4Ztiff_lzw	tiff_jpegjpegtiff_adobe_deflateZtiff_raw_16ZpackbitsZtiff_thunderscantiff_deflateZtiff_sgilogZtiff_sgilog24lzmaZzstdZwebp)r                        i  i  i)  i  it  iu  im  iP  iQ  c             C   s   i | ]\}}||qS  r   ).0kvr   r   E/var/www/html/venv/lib/python3.7/site-packages/PIL/TiffImagePlugin.py
<dictcomp>   s    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)   )zI;16zI;12)   )zI;16zI;16)zI;16BzI;16B)zI;16zI;16R)IzI;16S)r(   zI;16BS)r   )    )FzF;32F)r*   zF;32BF)r(   zI;32N)r(   zI;32S)r(   z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/   )PAr0   )r/   zP;Rr   )CMYKr1   )r1   ZCMYKX)r1   ZCMYKXX)r1   zCMYK;16Lr   )r,   r.   r   )LABr2   c             c   s   | ]}t |d  V  qdS )r   N)len)r   Zkey_tpr   r   r"   	<genexpr>  s    r4   s   MM *s   II* s   MM* s   II *s   MM +s   II+ c             C   s   | d d t kS )Nr   )PREFIXES)prefixr   r   r"   _accept  s    r7   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    r@   c             C   sP   t | }|j|jf}t||k r.t| t|}t||krLt | } t| |}|S )N)r   	numeratordenominatorminr@   r9   max)r<   r=   Zmin_valfracr?   r   r   r"   _limit_signed_rational  s    
rF   c               @   sR  e Zd ZdZdZd4d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)e*e+d2rNed2Z,d3S )5r:   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   )	
isinstancer:   rA   rG   rB   rH   rI   r   float)selfvaluerB   r   r   r"   __init__=  s    


zIFDRational.__init__c             C   s   | j S )N)rG   )rM   r   r   r"   rA   W  s    zIFDRational.numeratorc             C   s   | j S )N)rH   )rM   r   r   r"   rB   [  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   )rB   rA   rI   limit_denominator)rM   max_denominatorfr   r   r"   r;   _  s    
zIFDRational.limit_rationalc             C   s   t t| jS )N)strrL   rI   )rM   r   r   r"   __repr__l  s    zIFDRational.__repr__c             C   s
   | j  S )N)rI   __hash__)rM   r   r   r"   rU   o  s    zIFDRational.__hash__c             C   s0   | j }t|tr|j }t|tr(t|}||kS )N)rI   rK   r:   rL   )rM   otherr<   r   r   r"   __eq__r  s    

zIFDRational.__eq__c             C   s   | j | j| jgS )N)rI   rG   rH   )rM   r   r   r"   __getstate__z  s    zIFDRational.__getstate__c             C   s,   t | d |\}}}|| _|| _|| _d S )Nr   )r:   rO   rI   rG   rH   )rM   staterI   rG   rH   r   r   r"   __setstate__}  s
    
zIFDRational.__setstate__c                s    fdd}|S )Nc                s   t | j | S )N)getattrrI   )rM   args)opr   r"   delegate  s    z'IFDRational._delegate.<locals>.delegater   )r]   r^   r   )r]   r"   	_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____int__N)r   )-__name__
__module____qualname____doc__	__slots__rO   propertyrA   rB   r;   rT   rU   rW   rX   rZ   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   hasattrr   rz   r   r   r   r"   r:   /  sP   
r:   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ej$d8d9fg	 ed:d:d_d<d=Z%ed:d>d? Z&ed@d:d`dAdBZ'ed@dCdD Z(edEdFdadGdHZ)edEdIdJ Z*edKd:dbdLdMZ+edKdNdO Z,edPdFdcdQdRZ-edPdSdT Z.dUdV Z/dWdX Z0dddZd[Z1d\d] Z2dS )e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   t |s dt| d}t||dk	r,|n
|dd | _| jtkrLd| _n| jtkr^d| _nd}t||d dk| _|| _i | _	| 
  | jr| d	|d
d n| d|dd \| _d| _dS )a  Initialize an ImageFileDirectory.

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

        :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets
              endianness.
        :param prefix: Override the endianness of the file.
        znot a TIFF file (header z not valid)Nr   ><znot a TIFF IFD+   Qr   r%   r   F)r7   reprSyntaxError_prefixMM_endianII_bigtiffgrouptagtypereset_unpacknext_legacy_api)rM   ifhr6   r   msgr   r   r"   rO     s     

2zImageFileDirectory_v2.__init__c             C   s   | j S )N)r   )rM   r   r   r"   <lambda>      zImageFileDirectory_v2.<lambda>c             C   s   | j S )N)_offset)rM   r   r   r"   r     r   c             C   s   | j S )N)r   )rM   r   r   r"   r     r   c             C   s   d}t |d S )Nz"Not allowing setting of legacy api)	Exception)rM   rN   r   r   r   r"   
legacy_api  s    z ImageFileDirectory_v2.legacy_apic             C   s(   i | _ i | _i | _i | _d | _d | _d S )N)_tags_v1_tags_v2_tagdatar   _nextr   )rM   r   r   r"   r     s    zImageFileDirectory_v2.resetc             C   s   t t| S )N)rS   dict)rM   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   coderN   )rM   r   r"   r#   (  s   z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)items)rM   r   )rM   r"   named"  s    
zImageFileDirectory_v2.namedc             C   s   t t| jt| jB S )N)r3   setr   r   )rM   r   r   r"   __len__-  s    zImageFileDirectory_v2.__len__c             C   sf   || j kr>| j| }| j| }| j| \}}|| || j| |< | j | }| jrbt|ttfsb|f}|S )N)r   r   r   _load_dispatchr   rK   tuplebytes)rM   tagdatatypsizehandlerr<   r   r   r"   __getitem__0  s    



z!ImageFileDirectory_v2.__getitem__c             C   s   || j kp|| jkS )N)r   r   )rM   r   r   r   r"   __contains__;  s    z"ImageFileDirectory_v2.__contains__c             C   s   |  ||| j d S )N)_setitemr   )rM   r   rN   r   r   r"   __setitem__>  s    z!ImageFileDirectory_v2.__setitem__c          
      s  t ttf}t|| j t||r(|gn|}|| jk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 krt|dkr|s|rd| j| tjtjgkrd|f}y|\||< W n> tk
r   td| dt| d |d ||< Y nX n|||< d S )Nc             s   s   | ]}t |tV  qd S )N)rK   r:   )r   r!   r   r   r"   r4   L  s    z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c             s   s   | ]}|d kV  qdS )r   Nr   )r   r!   r   r   r"   r4   O  s    c             s   s   | ]}t |tV  qd S )N)rK   int)r   r!   r   r   r"   r4   R  s    c             s   s&   | ]}d |  kodk n  V  qdS )r   i   Nr   )r   r!   r   r   r"   r4   S  s    c             s   s&   | ]}d |  k odk n  V  qdS )i i   Nr   )r   r!   r   r   r"   r4   U  s    c             s   s   | ]}|d kV  qdS )r   Nr   )r   r!   r   r   r"   r4   Z  s    c             s   s   | ]}t |tV  qd S )N)rK   rL   )r   r!   r   r   r"   r4   ]  s    c             s   s   | ]}t |tV  qd S )N)rK   rS   )r   r!   r   r   r"   r4   _  s    c             s   s   | ]}t |tV  qd S )N)rK   r   )r   r!   r   r   r"   r4   a  s    c             S   s&   g | ]}t |tr|d dn|qS )asciireplace)rK   rS   encode)r   r!   r   r   r"   
<listcomp>f  s   z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c             S   s"   g | ]}t |trt|n|qS r   )rK   r   rL   )r   r!   r   r   r"   r   j  s    c             3   s   | ]}  |V  qd S )N)Zcvt_enum)r   rN   )infor   r"   r4   n  s    r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   r   rS   r   r   r   rK   r   type	UNDEFINEDallZRATIONALZSIGNED_RATIONALSHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr   r   r   r   lengthr3   
ValueErrorwarningswarn)rM   r   rN   r   Z	basetypesvaluesis_ifddestr   )r   r"   r   A  s^    

 zImageFileDirectory_v2._setitemc             C   s.   | j |d  | j|d  | j|d  d S )N)r   popr   r   )rM   r   r   r   r"   __delitem__  s    z!ImageFileDirectory_v2.__delitem__c             C   s   t t| jt| jB S )N)iterr   r   r   )rM   r   r   r"   __iter__  s    zImageFileDirectory_v2.__iter__c             C   s   t | j| |S )N)structunpackr   )rM   fmtr   r   r   r"   r     s    zImageFileDirectory_v2._unpackc             G   s   t j| j| f| S )N)r   packr   )rM   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   r"   _register_loader  s    z&ImageFileDirectory_v2._register_loaderc                s    fdd}|S )Nc                s   | t  < | S )N)_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   |  t|    |S )N)r   r3   )rM   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 )N)r   )r   rN   )r   rM   r   r"   r4     s    zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>)join)rM   r   )r   )rM   r"   r     s    )T)r   r   r   calcsizer   r   )Zidx_fmt_namer   r   r   r   )r   r   r"   _register_basic  s    
z%ImageFileDirectory_v2._register_basicHshortr%   longbzsigned bytehzsigned shortlzsigned longrR   rL   ddoubler   Zlong8r   Tc             C   s   |S )Nr   )rM   r   r   r   r   r"   	load_byte  s    zImageFileDirectory_v2.load_bytec             C   s*   t |trt|}t |tr&t|f}|S )N)rK   r:   r   r   )rM   r   r   r   r"   
write_byte  s
    


z ImageFileDirectory_v2.write_byter   c             C   s"   | dr|d d }|ddS )N    r8   zlatin-1r   )endswithdecode)rM   r   r   r   r   r"   load_string  s    
z!ImageFileDirectory_v2.load_stringc             C   s0   t |trt|}t |ts(|dd}|d S )Nr   r   r   )rK   r   rS   r   r   )rM   rN   r   r   r"   write_string  s
    

z"ImageFileDirectory_v2.write_stringr   r   c                sV   |  t|d  d|}fdd t fddt|d d d |dd d D S )	Nr   r%   c                s    r| |fS t | |S )N)r:   )ar   )r   r   r"   combine  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec             3   s   | ]\}} ||V  qd S )Nr   )r   numdenom)r   r   r"   r4     s    z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   )r   r3   r   zip)rM   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t|d V  qdS )2Ll    N)r   )r   r@   )r   rE   )rM   r   r"   r4     s    z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>)r   )rM   r   r   )rM   r"   write_rational  s    z$ImageFileDirectory_v2.write_rationalr   c             C   s   |S )Nr   )rM   r   r   r   r   r"   load_undefined  s    z$ImageFileDirectory_v2.load_undefinedc             C   s   t |trt|dd}|S )Nr   r   )rK   r   rS   r   )rM   rN   r   r   r"   write_undefined   s    
z%ImageFileDirectory_v2.write_undefined
   c                sV   |  t|d  d|}fdd t fddt|d d d |dd d D S )	Nr   r   c                s    r| |fS t | |S )N)r:   )r   r   )r   r   r"   r   
  s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec             3   s   | ]\}} ||V  qd S )Nr   )r   r   r   )r   r   r"   r4     s    z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   )r   r3   r   r   )rM   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t|dd V  qdS )2lii   N)r   )r   rF   )r   rE   )rM   r   r"   r4     s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>)r   )rM   r   r   )rM   r"   write_signed_rational  s    
z+ImageFileDirectory_v2.write_signed_rationalc             C   s8   | |}t||kr4d| dt| d}t||S )Nz&Corrupt EXIF data.  Expecting to read z bytes but only got z. )readr3   OSError)rM   fpr   retr   r   r   r"   _ensure_read  s
    
z"ImageFileDirectory_v2._ensure_readc          
   C   s  |    | | _y>| jr0| d| |dn| d| |dd }xt|D ]}| jrt| d| |dn| d| |d	\}}}}t|| j	j
}t|d
}	d| d| d|	 d| d	}
y| j| \}}W n, tk
r   t|
d|   wTY nX || }|| jr dndkr| }| | jr@dnd|\}|
d| d| 7 }
|| t||}|| n|d | }t||krtd| dt| d|  t|
 qT|st|
 qT|| j|< || j|< |
d|dkrd| nt| 7 }
t|
 qTW | jr8| d| |dn| d| |d\| _W n2 tk
r }
 ztt|
 d S d }
~
X Y nX d S )Nr   r   r   r   r   ZHHQ8s   HHL4sr&   unknownztag: z (z
) - type: )z - unsupported type r   r%   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read z bytes but only got z. Skipping tag z
 - value: r)   z<table: %d bytes>)r   tellr   r   r   r  ranger   r   r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readr3   r   r   r   r   r   r   r  rS   )rM   r  Z	tag_countir   r   countr   tagnametypnamer   Z	unit_sizer   r   hereoffsetr   r   r"   load   sX    





zImageFileDirectory_v2.loadr   c             C   s4  |  dt| j}g }|t| t| jd  d }d }xt| j D ]\}}|tkrdt|}| j|}t	d| d| dt
|  |tjkot|t}|r| jdkrd}	nd	}	t|	|d
}
| j| }x| D ]\}}||
|< qW |
|}n*t|tr|n|f}| j| | f| }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gkrt|}nt|}t|dkr|||||dddf qJ|||||  d||f |t|d d d 7 }qJW |d k	r|| \}}}}}|rdd}t||  d| d|d | }|||||f||< x\|D ]T\}}}}}t	| d| d| dt
| dt
| 	 ||  d||||7 }qW |d7 }x6|D ].\}}}}}||7 }t|d@ r|d7 }qW |S )Nr   r&   r   zTag z, Type: z	, Value: r   s   II*    s   MM *   )r   ifdr  zsave: z (z
) - type: r	  z
 - value: r'   z<table: %d bytes>r   r   r   r%   r   z&multistrip support not yet implementedr   r   r  s       ) r   r3   r   sortedr   STRIPOFFSETSr   r  r  r  r   r   r   rK   r   r   r   tobytesr   r   r   r   r   r   rS   r   r   r   appendljustNotImplementedErrorr   )rM   r  resultentriesZstripoffsetsr   rN   r   r   r   r  r   Zifd_tagZ	ifd_valuer   r  r  r   r  r   r   r"   r  c  sh     

&


.zImageFileDirectory_v2.tobytesc             C   sN   |  dkr&|| j| ddd  |  }| |}|| |t| S )Nr   ZHL*   r   )r
  writer   r   r  r3   )rM   r  r  r   r   r   r"   save  s    

zImageFileDirectory_v2.save)r   NN)T)T)T)T)T)r   )3r{   r|   r}   r~   rO   r   r6   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IFDZLONG8r   r   r   r   r   r   r   r   r   r   r  r  r  r$  r   r   r   r"   r     sh   ;
 P







	
C
Mr   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|| d| _d S )NT)superrO   r   )rM   r\   kwargs)	__class__r   r"   rO     s    zImageFileDirectory_v1.__init__c             C   s   | j S )N)r   )rM   r   r   r"   r     r   zImageFileDirectory_v1.<lambda>c             C   s   | j S )N)r   )rM   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`

        )r6   )r6   r   r   r   )clsoriginalr  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`

        )r6   )r   r6   r   r   r   r   )rM   r  r   r   r"   to_v2  s
    zImageFileDirectory_v1.to_v2c             C   s   || j kp|| jkS )N)r   r   )rM   r   r   r   r"   r     s    z"ImageFileDirectory_v1.__contains__c             C   s   t t| jt| jB S )N)r3   r   r   r   )rM   r   r   r"   r   	  s    zImageFileDirectory_v1.__len__c             C   s   t t| jt| jB S )N)r   r   r   r   )rM   r   r   r"   r     s    zImageFileDirectory_v1.__iter__c             C   s    xdD ]}|  ||| qW d S )N)FT)r   )rM   r   rN   r   r   r   r"   r     s    
z!ImageFileDirectory_v1.__setitem__c             C   sr   || j krP| j| }| j| }| j| \}}x"dD ]}| ||| ||| q2W | j | }t|ttfsn|f}|S )N)FT)r   r   r   r   r   rK   r   r   )rM   r   r   r   r   r   legacyr<   r   r   r"   r     s    




z!ImageFileDirectory_v1.__getitem__)r{   r|   r}   r~   rO   r   tagsZtagdatar   __annotations__classmethodr/  r0  r   r   r   r   r   __classcell__r   r   )r,  r"   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dd Z fddZdd Zdd Zdd Z  ZS )TiffImageFileZTIFFz
Adobe TIFFFNc                s   d | _ d | _t || d S )N)tag_v2r   r*  rO   )rM   r  filename)r,  r   r"   rO   -  s    zTiffImageFile.__init__c             C   s   | j d}|d dkr(|| j d7 }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   r   r   Nr8   z*** TiffImageFile._open ***z- __first: z- ifh: r   )r  r  r   r7  r  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesr  r  r   _seek)rM   r   r   r   r"   _open6  s    

zTiffImageFile._openc             C   sT   | j d krN|  }| t| j x | j d krB| |  d  q$W | | | j S )Nr   )r=  r
  r>  r3   r<  r  )rM   currentr   r   r"   n_framesQ  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_checkr>  r   Z_decompression_bomb_checkr   corenewmodeim)rM   framer   r   r"   r  [  s
    

zTiffImageFile.seekc             C   sL  | j | _| j  xt| j|kr| js4d}t|td| d| j	 d| j d| j   | j
| j | j| j td| j   | j| j | jj| jkrd| _n
| jj| _| jdkr|d | _t| jdkr| jdk| _|  j	d7  _	qW | 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;  r  r
  r3   r<  r9  EOFErrorr  r  r:  r  r  r7  r  r   r=  is_animatedZ_reload_exifr)  r/  r   r  _setup)rM   rF  r   r   r   r"   r>  f  s4    
(


zTiffImageFile._seekc             C   s   | j S )zReturn the current frame number)r:  )rM   r   r   r"   r
    s    zTiffImageFile.tellc             C   s   t | jkr| | jt  S i S )z
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        )XMPr7  Z_getxmp)rM   r   r   r"   getxmp  s    zTiffImageFile.getxmpc             C   s   i }| j d}|rx|dd dkrt|dd }t|d d d d }t|d| d|  }|d| d| |  }d	|i||< |td| | d d d }qW |S )
a5  
        Returns a dictionary of Photoshop "Image Resource Blocks".
        The keys are the image resource ID. For more information, see
        https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727

        :returns: Photoshop "Image Resource Blocks" in a dictionary.
        iI  Nr   s   8BIMr   r   r   r   r   )r7  r  i16mathceili32)rM   blocksr<   idnr   r   r   r   r"   get_photoshop_blocks  s    &z"TiffImageFile.get_photoshop_blocksc                s   | j r| jr|  S t  S )N)tileuse_load_libtiff_load_libtiffr*  r  )rM   )r,  r   r"   r    s    zTiffImageFile.loadc             C   s   | j r^tjjtjjtjjtjjtjjtjjtjj	d
| j }|d k	r^| j|| _| jj| _| jsd| _| j  |  }x"tjD ]}||krq|| qW d S )N)r   r   r   r   r   r   r   T)_tile_orientationr   Z	TransposeZFLIP_LEFT_RIGHTZ
ROTATE_180ZFLIP_TOP_BOTTOMZ	TRANSPOSEZ
ROTATE_270Z
TRANSVERSEZ	ROTATE_90r  rE  Z	transposer   _sizerH  !_close_exclusive_fp_after_loadingr  r
  Zgetexifr   TAGS_V2_GROUPSget_ifd)rM   methodexifkeyr   r   r"   load_end  s(    

zTiffImageFile.load_endc       
   
   C   s  t j |  |   t| jdks.d}t|| jd d }t| jd d }y6t| jdojt	
| j }t| jdr| j  W n tk
r   d}Y nX |r||d< t | jd	t|| j}y|| j| W n2 tk
r } zd
}t||W dd}~X Y nX | jo| j }t| jdrFtd || j \}}	n\|rxtd |sh| jd |d\}}	n*td | jd || j \}}	|ryt	| W n tk
r   Y nX g | _d| _|   |r| j  d| _|	dk r
t|	t j | S )zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r   filenoflushFr   libtiffzCouldn't set the imageNgetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.s   fpfpz+don't have fileno or getvalue. just reading)r   r  Zload_preparer3   rT  r  r&  r   r  osdupr`  ra  Z_getdecoderrD  r   ZdecoderconfigsetimagerE  r   Z_exclusive_fprH  r  r  r   rc  r  r  closereadonlyr_  )
rM   r   Zextentsr\   r  decodereZclose_self_fprR  errr   r   r"   rV    s`    






zTiffImageFile._load_libtiffc          
   C   s>  d| j krd}t|t| j td | _| j td| _| j td}| jdkrVd}| j t	d}t
d t
d| j  t
d	|  t
d
| j  t
d|  t
d| jt  t| j t}t| j t}||f| _t
d| j  | j td}t|dkrJt|t|  krBdkrJn nd}| j td}| j td}|dkrvd}	n|dkrd}	nd}	|	t|7 }	t|}
| j t| jdkr|dkrdnd}|tkrt
d| d}t|||
k r |d| }n||
kr|
dkr|| }t||kr6d}t|| j j|||||f}t
d|  yt| \| _}W n< t k
r } zt
d d}t||W dd}~X Y nX 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rH|d! |d! f| j!d < n6|dkrp||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&|kr|(d&d'}d(|kr(|(d(d'}|dkrN| jd)krN| jdkrNd*}|| jd+| j j)f}| j%*d,dd||fd|f n\t+| j kst,| j krt+| j kr| j t+ }| j t-|}| jd }n"| j t, }| j t.}| j t/}x|D ]}|| |kr|t0| d- }nd}|}| jdkr8|| }||	 }|t|df}| j%*| j||t|| |t|| |f||f || }|| jd krd||  }}|| jd krd }}|d7 }qW nt
d. d}t|t1| j kr| j t1 | j!d/< | jd0kr,d1d2 | j t2 D }t34d3d45|| _6| j d5| _7dS )6z-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: z- size: )r   r   )r   r   r   r   r   r   )r   r   z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelNzunknown data organizationzformat key: z- unsupported formatzunknown pixel modez- raw mode: z- pil mode: compressionr   dpigRQ@
resolutionr   zI;16zI;16Nz;16Bz;16Nz;16Lr   r,   Frb  r   z- unsupported data organizationicc_profile)r/   r0   c             S   s   g | ]}t |d  qS )r   )r   )r   r   r   r   r"   r     s    z(TiffImageFile._setup.<locals>.<listcomp>zRGB;Lr   i  )8r7  r  COMPRESSION_INFOr  COMPRESSION_compressionPLANAR_CONFIGURATIONZ_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERr  r  r   YCBCRSUBSAMPLINGr   
IMAGEWIDTHIMAGELENGTHrX  r   SAMPLEFORMATr3   rD   rC   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELerrorr   r6   	OPEN_INFOrD  r  r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITrT  READ_LIBTIFFrU  r   r  r  r  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr
   r   r   paletterW  )rM   r   photoZ	fillorderZxsizeZysizeZsample_formatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamples_per_pixelr^  rawmoderj  ZxresZyresZresunitxylayerr   offsetsr   wr  strideZtile_rawmoder  r   r   r"   rI  /  s   



2

 










 



zTiffImageFile._setup)NN)r{   r|   r}   formatformat_descriptionrY  rO   r?  r   rA  r  r>  r
  rK  rS  r  r_  rV  rI  r5  r   r   )r,  r"   r6  (  s   	
&	]r6  r$   r%   r+   r/   r0   zI;32SzI;16zI;16SzF;32Fr,   r.   r-   r1   YCbCrr2   zI;32BSzI;16BzI;16BSzF;32BF)r$   r%   r+   r/   r0   r(   zI;16zI;16Sr*   r,   r.   r-   r1   r  r2   zI;32BSzI;16BzI;16BSzF;32BFc       2      C   sj	  yt | j \}}}}}}W n: tk
rT }	 zd| j d}
t|
|	W d d }	~	X Y nX t|d}| j}| j}y|d }W n. tk
r   | jd}t	|t
rd }Y nX |d krd}n|dkrd}n|dkrd	}tp|dk}d
|t< | jd |t< | jd
 |t< d|kr|d }n:d|krJ|d }t	|trNt }|| |}ni }tdt|  t	|trt| }xr|D ]j}t	|tjr|tjkr||||< n||||< y|j| |j|< W n tk
r   Y nX qzW t| dr<xFtt t!t"t#t$fD ]2}|| j%kr| j%| ||< | j%j| |j|< qW |d| jd}|r^||t&< xdt'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g
D ] \}}||kr|| ||< qW |d}|rd|t< |d |t < |d
 |t!< |dkr ||t,< t-|d
kr t-||t.< |d k	r2||t/< |d
krD||t0< t1|krX||t1< n| jdkr|t1 dkr| jdkr| 2 }| }xLt3|j4D ]>}x6t3|j5D ](}|||f dkrdnd|||f< qW qW |} n
t67| } | jd krj| j89d!d"}g }t-|d# }xJt3d#D ]>}|d$d% ||| ||d
   D 7 }|dgd&|  7 }q W ||t:< t-|| jd |d  d' d(  }|r|d)t;}|dkrd
nt<|| | jd
 } |dkrt<| d' d( d( | jd
 } n
| jd
 } | dkr d
} |dkrd
n||  }!| jd
 |  d
 |  }"| |t=< |!d*krJtj>|jt?< |!f|"d
  || jd
  |!|"d
   f |t?< t@t3d|!|" |!|tA< tB|d
|tC< | jd+krx*tDd,tEd-iF D ]\}#}$|G|#|$ qW tHtItJtKg}%|	rd.|krF|d. }&t	|&t
r|&dk s|&d/kr(d0}
tL|
|dkr>d1}
tL|
|&|tM< td2 td3tN|F   d}'t|d4ry|Od tPQ|R }'W n tSjTk
r   Y nX i }(|%tEt?tAtUtVg7 }%t,|d i})i }*t| d5r| jW }*tX| di |*}+t0|+kr|+t0= xtYZ|F |+F D ]\}#}$|#tj[krtXtj\d6d7sFq|#|jkrb|j|# |(|#< n4t	|$t
t]t^tfs|qnt_|#j`},|,r|,|(|#< |#|)kr|#|%krt	|$t^r|$ad8d9d: |)|#< n"t	|$tbrt]|$|)|#< n|$|)|#< qW t0|)kr t-|)t0 d
kr |)t0 d |)t0< td;tN|)F   | jd<krFd=}t|)F }-|-c  |||'||-|(f}.td| jd>|.|}	|	e| j8d?| j  x4|	ad@d
d  \}/}0|'s|f|0 |/rP qW |'rytPg|' W n tk
r   Y nX |/dk 	rVdA|/ dB}
t|
nDx|%D ]}#||#= 	qW |h|}1tij| |dd?| j |1||d
ffg dC|k	rf|| _kd S )DNzcannot write mode z as TIFF)r6   rl  r   r   r   r   r   r   r   Ztiffinfor]  zTiffinfo Keys: %sr7  ro  descriptionrn  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightrm  r   )r   )r$   r%   r$      )r/   r0   r,   zRGB;Lr   c             S   s   g | ]}|d  qS )r   r   )r   r!   r   r   r"   r     s    z_save.<locals>.<listcomp>r   r   r   Z
strip_sizei   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   Zlibtiff_support_custom_tagsFr   r   r   zConverted items: %s)zI;16BzI;16zI;16Nrb  )r   r   i @  zencoder error z when writing image file_debug_multipage)l	SAVE_INFOrD  r  r  r   encoderinfoencoderconfigr   r  rK   r   WRITE_LIBTIFFrs  r   rw  rx  r   r   ZExifr  r  r  r&  r)  r0  r   rZ  r[  r   r   r   r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKrJ  r7  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTrz  r3   r|  r{  ry  rt  copyr  heightwidthr	   invertrE  Z
getpaletter  
STRIP_SIZErC   r  r   STRIPBYTECOUNTSr   r  COMPRESSION_INFO_REVrq  rv  REFERENCEBLACKWHITEr   
setdefaultr  r  r  TILEBYTECOUNTSr   JPEGQUALITYr  r  rd  re  r`  ioUnsupportedOperationTRANSFERFUNCTIONSUBIFDr   r[   	itertoolschainZLIBTIFF_CORErB  rL   rS   r   r   r   r:   sortZ_getencoderrf  r#  rg  r$  r   _saver  )2rE  r  r8  r  r6   r  r  bitsextrarj  r   r  r  r  rl  rb  r   r]  r^  Ziccr   rm  Zinverted_imZpxr  r  ZlutZcolormapcolorsr  r  Zim_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imager   rN   Z	blocklistr  r;  typesZattsZ
legacy_ifdZsupplied_tagsr   r2  r   errcoder   r  r   r   r"   r  2  s   















.
&""



"
 









 
r  c               @   s   e Zd ZdddddddddddddgZdddd	d
dhZd:d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/d0 Zd1d2 Zd3d4 Zd5d6 Zd;d7d8Zd9S )<AppendingTiffWriterr   r   r   r   r   i  i   iD  i  i  i	  Fc             C   sv   t |dr|| _d| _nF|| _d| _yt||r2dnd| _W n  tk
r\   t|d| _Y nX | j | _|   d S )Nr  FTzw+bzr+b)	r   rR   close_fpr   openr  r
  	beginningsetup)rM   fnrC  r   r   r"   rO   q  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d	}t||   |   d S )
Nr   r   TFs   II* r   s   MM *r   zInvalid TIFF file header)rR   r  r  rd  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPager  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)rM   iimmr   r   r   r"   r    s     zAppendingTiffWriter.setupc             C   s   | j r
d S | j| j | jd}|s,d S || jkrBd}t||  }|| j7 }| j| j | 	| | j| | 
  d S )Nr   z1IIMM of new page doesn't match IIMM of first page)r  rR   r  r  r  r  r  readLongr  	writeLongfixIFD)rM   r  r   
ifd_offsetr   r   r"   finalize  s    


zAppendingTiffWriter.finalizec             C   s   |    |   d S )N)r  r  )rM   r   r   r"   newFrame  s    zAppendingTiffWriter.newFramec             C   s   | S )Nr   )rM   r   r   r"   	__enter__  s    zAppendingTiffWriter.__enter__c             C   s   | j r|   dS )NF)r  rg  )rM   exc_type	exc_value	tracebackr   r   r"   __exit__  s    zAppendingTiffWriter.__exit__c             C   s   | j  | j S )N)rR   r
  r  )rM   r   r   r"   r
    s    zAppendingTiffWriter.tellc             C   s*   |t jkr|| j7 }| j|| |  S )N)rd  r  r  rR   r  r
  )rM   r  whencer   r   r"   r    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'   )rR   r  rd  SEEK_ENDr
  r#  r   r  )rM   posZ	pad_bytesr   r   r"   r    s    
zAppendingTiffWriter.goToEndc             C   s.   || _ | j d | _| j d | _| j d | _d S )Nr%   r   ZHHL)endianlongFmtshortFmt	tagFormat)rM   r  r   r   r"   r    s    zAppendingTiffWriter.setEndianc             C   sT   xN|   }|dkr$| j d | _P | j| |  }| j|d tj qW d S )Nr   r   r&   )r  rR   r
  r  r  	readShortrd  SEEK_CUR)rM   r  num_tagsr   r   r"   r    s    zAppendingTiffWriter.skipIFDsc             C   s   | j |S )N)rR   r#  )rM   r   r   r   r"   r#    s    zAppendingTiffWriter.writec             C   s   t | j| jd\}|S )Nr   )r   r   r  rR   r  )rM   rN   r   r   r"   r    s    zAppendingTiffWriter.readShortc             C   s   t | j| jd\}|S )Nr   )r   r   r  rR   r  )rM   rN   r   r   r"   r    s    zAppendingTiffWriter.readLongc             C   sN   | j dtj | j t| j|}|d k	rJ|dkrJd| d}t|d S )Nr   zwrote only z bytes but wanted 4)	rR   r  rd  r  r#  r   r   r  r  )rM   rN   bytes_writtenr   r   r   r"   rewriteLastShortToLong  s
    z*AppendingTiffWriter.rewriteLastShortToLongc             C   sN   | j dtj | j t| j|}|d k	rJ|dkrJd| d}t|d S )Nr  r   zwrote only z bytes but wanted 2)	rR   r  rd  r  r#  r   r   r  r  )rM   rN   r  r   r   r   r"   rewriteLastShort  s
    z$AppendingTiffWriter.rewriteLastShortc             C   sN   | j dtj | j t| j|}|d k	rJ|dkrJd| d}t|d S )Nr   zwrote only z bytes but wanted 4)	rR   r  rd  r  r#  r   r   r  r  )rM   rN   r  r   r   r   r"   rewriteLastLong  s
    z#AppendingTiffWriter.rewriteLastLongc             C   s>   | j t| j|}|d k	r:|dkr:d| d}t|d S )Nr   zwrote only z bytes but wanted 2)rR   r#  r   r   r  r  )rM   rN   r  r   r   r   r"   
writeShort  s    zAppendingTiffWriter.writeShortc             C   s>   | j t| j|}|d k	r:|dkr:d| d}t|d S )Nr   zwrote only z bytes but wanted 4)rR   r#  r   r   r  r  )rM   rN   r  r   r   r   r"   r  	  s    zAppendingTiffWriter.writeLongc             C   s   |    | j  d S )N)r  rR   rg  )rM   r   r   r"   rg    s    zAppendingTiffWriter.closec             C   s  |   }xt|D ]}t| j| jd\}}}| j| }|| }|dk}|sl|  }	|	| j	7 }	| 
|	 || jk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W d S )Nr   r   r   )isShortisLong)r  r  r   r   r  rR   r  
fieldSizesr  r  r  Tagsr
  
fixOffsetsr  rd  r  )rM   r  r  r   Z
field_typer  Z
field_size
total_sizeis_localr  Zcur_posr   r   r"   r    s.    





zAppendingTiffWriter.fixIFDc             C   s   |s|sd}t |xt|D ]}|r.|  n|  }|| j7 }|r|dkr|dkr`d}t || | | jdtj	 | 
tj | jdtj	 q|r| | q| | qW d S )Nz offset is neither short nor longi   r   znot implementedir   )r  r  r  r  r  r  rR   r  rd  r  r  r   r   r  r  )rM   r  r  r  r   r  r  r   r   r"   r  6  s"    

zAppendingTiffWriter.fixOffsetsN)F)FF)r{   r|   r}   r  r  rO   r  r  r  r  r  r
  r  r  r  r  r  r  r#  r  r  r  r  r  r  r  rg  r  r  r   r   r   r"   r  X  sH   	

#r  c          	   C   s   | j  }| j}t|dg }t| ds:|s:t| ||S |  }zt|t}xl| g| D ]^}||_ ||_t|dszd}	n|j	}	x6t
|	D ]*}
||
 |  t||| |  qW qZW W d Q R X W d | | X d S )Nappend_imagesrA  r   )r  r  r  r&  r  r   r  r
  r  rA  r  r  r  r  )rE  r  r8  r  r  r  Zcur_idxtfZimsZnfrr   r   r   r"   	_save_allP  s(    



r  z.tifz.tiffz
image/tiff)kr  r  loggingrM  rd  r   r   collections.abcr   	fractionsr   numbersr   r    r   r   r	   r
   r   _binaryr   rL  r   rO  r   r   	getLoggerr{   r  r  r  ZIFD_LEGACY_APIr  r   r   rw  rx  rz  rq  rt  ru  r  r  r|  r  r  r  r  rs  r  r  r  r  r  Z	PREDICTORr  r  r  r  r  r  r{  ry  Z
JPEGTABLESrv  r  r  r  r  r  ZEXIFIFDrJ  r  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATArp  r   r  r  rD   r}  r5   r7   r@   rF   r   r   r:   r   r   r   r   setattrr)  ZImageFileDirectoryr6  r  r  r  r  Zregister_openr  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer   r   r   r"   <module>)   s  
     \   w  ( y