3

hJ                @   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j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 eDjE D ZFed dddf fded dddf fded ddIdf fded ddIdf fdeddddf fdeddddf fdedddIdf fdedddIdf fded dddf fded dddf fded ddIdf fded ddIdf fdeddddf fdeddddf fdedddIdf fdedddIdf fded dddf fded dddf fded ddIdf fded ddIdf fdeddddf fdeddddf fdedddIdf fdedddIdf fded dddf fded dddf fded ddIdf fd ed ddIdf fdeddddf fdeddddf fd	edd
dIdf fdedddIdf fdeddddf fdeddddf fdeddddf fdeddddf fdeddddf fded ddd f fd!ed d"dd#f fd$edd%dd&f fd'edd(dd)f fd*edd+dd,f fd-edd.dd/f fd0edd1dd2f fd3edd4dd5d6fd7edd8dd9d:fd;edId<dd=f fd>edId?dd@f fdAedIdBdIdCf fdDedIdEdIdFf fdGedIdHddIf fdJedIdKddLf fdMedIdNddOdPfdQedIdRddSdTfdUedIdVddWdXfdYedIdZdd[d\fd]edId^dd_d`fdaedIdbddcddfdeedIdfddgdhfdiedIdjddkdlfdmedIdnddodpfdqedIdrddsdtfduedIdvddwdxfdyedIdzdd{d|fd}edId~dddfdedIddddfdedIddddfdedIddddfdedIddddfdedIddddfdedIddddfdedIddddfdedIdddf fdedIdddf fdedIdddf fdedIdddf fdedIddddfdedIddddfdedIddddfdedIddddfdedIddddfdedIddddfdedbdddf fdedbdddf fdedbddIdf fdedbddIdf fdedbdddf fdedbdddf fdedbddIdf fdedbddIdf fdedbdddf fdedbdddf fdedbddIdf fdedbddIdf fdedbdddf fdedbdddf fdedbddddfdedbddddfdedbddIdf fdedbddIdf fdeddddf fdeddddf fdedd dddfdedddddfdedddd	d
fdedddddfdeddddf fdeddddf fdeddddf fdedVdddf fdedVdddf fdioZGddddgZHdd ZIdd ZJdd ZKi ZLi ZMG dd deZNG dd deZOeLeO_LeMeO_MxNejE D ]B\ZPZQeQjRddZQeSeOdeQ eLeP d  eSeOdeQ eMeP  qW [L[M[P[QG dd deOZTeTZUG dd dejZVdGeddddfdLeddd dfdjeddd!dIfdedbdd"dfdedbdd#dIfdheddId$dfd[eddd%dfd`eddId&dfdeeddbd'dfdkedIdd(dfdnedIdd)d fdmedIdd*dIfdeddd+dfdeddd,dfdedVdd-dfdieddId.dfd^eddd/dfdaeddId0dfdfeddbd1dfdZWdd ZXG dd dZYdd ZZej[eVj\eVeI ej]eVj\eX ej^eVj\eZ ej_eVj\ddg ej`eVj\d dS (2      N)MutableMapping)Fraction)NumberRational   )Image	ImageFileImageOpsImagePaletteTiffTags)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@  iD  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   S/var/www/html/enquirykeeper_venv/lib/python3.6/site-packages/PIL/TiffImagePlugin.py
<dictcomp>   s    r!   11;Ir   1;IR1;RLL;2IL;2IRL;2L;2Rr   L;4IL;4IRL;4L;4Rr   L;IL;IRL;R   I;16I;12   I;16BII;16SI;16BSr       FF;32FF;32BFI;32NI;32SI;32BSLARGBRGB;RRGBARGBXRGBXXRGBXXXRGBaRGBaXRGBaXXRGBAXRGBAXX  RGB;16LRGB;16BRGBA;16LRGBA;16BRGBX;16LRGBX;16BRGBa;16LRGBa;16BPP;1P;1RP;2P;2RP;4P;4RPAP;Rr   CMYKCMYKXCMYKXXCMYK;16Lr   LABs   MM *s   II* s   MM* s   II *c             C   s   | d d t kS )Nr   )PREFIXES)prefixr   r   r    _accept  s    rf   c             C   s<   t | dk}t|rd|  n| j|}|r8|d d d S |S )Nr   )absIFDRationallimit_rational)valmax_valinvn_dr   r   r    _limit_rational  s    ro   c             C   sP   t | }|j|jf}t||k r.t| t|}t||krLt | } t| |}|S )N)r   	numeratordenominatorminro   rh   max)rk   rl   Zmin_valfracrn   r   r   r    _limit_signed_rational  s    
ru   c               @   s>  e Zd ZdZd5Zd6d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d0Z&ed1Z'ed2Z(ed3Z)d4S )7ri   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   )	
isinstanceri   rp   rv   rq   rw   rx   r   float)selfvaluerq   r   r   r    __init__1  s    


zIFDRational.__init__c             C   s   | j S )N)rv   )ar   r   r    rp   K  s    zIFDRational.numeratorc             C   s   | j S )N)rw   )r   r   r   r    rq   O  s    zIFDRational.denominatorc             C   s.   | j dkr| j| j fS | jj|}|j|j fS )z

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )rq   rp   rx   Zlimit_denominator)r|   Zmax_denominatorfr   r   r    rj   S  s    
zIFDRational.limit_rationalc             C   s   t t| jS )N)strr{   rx   )r|   r   r   r    __repr__`  s    zIFDRational.__repr__c             C   s
   | j j S )N)rx   __hash__)r|   r   r   r    r   c  s    zIFDRational.__hash__c             C   s0   | j }t|tr|j }t|tr(t|}||kS )N)rx   rz   ri   r{   )r|   otherrk   r   r   r    __eq__f  s    

zIFDRational.__eq__c             C   s   | j | j| jgS )N)rx   rv   rw   )r|   r   r   r    __getstate__n  s    zIFDRational.__getstate__c             C   s,   t j| d |\}}}|| _|| _|| _d S )Nr   )ri   r~   rx   rv   rw   )r|   staterx   rv   rw   r   r   r    __setstate__q  s
    
zIFDRational.__setstate__c                s    fdd}|S )Nc                s   t | j | S )N)getattrrx   )r|   args)opr   r    delegatey  s    z'IFDRational._delegate.<locals>.delegater   )r   r   r   )r   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)rv   rw   rx   )r   )*__name__
__module____qualname____doc__	__slots__r~   propertyrp   rq   rj   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    ri   #  sL   
ri   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 kr$tdt| d|dk	r0|n
|dd | _| jtkrPd| _n| jtkrbd| _ntd|| _i | _| j	  | j
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)rd   SyntaxErrorrepr_prefixMM_endianIIgrouptagtypereset_unpacknext_legacy_api)r|   ifhre   r   r   r   r    r~     s    

zImageFileDirectory_v2.__init__c             C   s   | j S )N)r   )r|   r   r   r    <lambda>  s    zImageFileDirectory_v2.<lambda>c             C   s   | j S )N)_offset)r|   r   r   r    r     s    c             C   s   | j S )N)r   )r|   r   r   r    r     s    c             C   s   t dd S )Nz"Not allowing setting of legacy api)	Exception)r|   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   )r|   r   r   r    r     s    zImageFileDirectory_v2.resetc             C   s   t t| S )N)r   dict)r|   r   r   r    __str__
  s    zImageFileDirectory_v2.__str__c                s    fdd j  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jqS r   )r   lookupr   name)r   coder}   )r|   r   r    r!     s   z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)items)r|   r   )r|   r    named  s    
zImageFileDirectory_v2.namedc             C   s   t t| jt| jB S )N)lensetr   r   )r|   r   r   r    __len__  s    zImageFileDirectory_v2.__len__c             C   sh   || j kr>| j| }| j| }| j| \}}|| || j| |< | j | }| jrdt|ttf rd|f}|S )N)r   r   r   _load_dispatchr   rz   tuplebytes)r|   tagdatatypsizehandlerrk   r   r   r    __getitem__  s    



z!ImageFileDirectory_v2.__getitem__c             C   s   || j kp|| jkS )N)r   r   )r|   r   r   r   r    __contains__&  s    z"ImageFileDirectory_v2.__contains__c             C   s   | j ||| j d S )N)_setitemr   )r|   r   r}   r   r   r    __setitem__)  s    z!ImageFileDirectory_v2.__setitem__c                s  t ttf}tj|| 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}| r jdksD| j| tjksD jd krt|dkr| r|rh| j| tjtjgkrh|f}y|\||< W n> tk
r   tjd| dt| d |d ||< Y nX n|||< d S )Nc             s   s   | ]}t |tV  qd S )N)rz   ri   )r   r   r   r   r    	<genexpr>7  s    z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c             s   s   | ]}|d kV  qdS )r   Nr   )r   r   r   r   r    r   :  s    c             s   s   | ]}t |tV  qd S )N)rz   int)r   r   r   r   r    r   =  s    c             s   s&   | ]}d |  kodk n  V  qdS )r   r   r5   Ni   r   )r   r   r   r   r    r   >  s    c             s   s&   | ]}d|  k odk n  V  qdS )r      Ni   i i   r   )r   r   r   r   r    r   @  s    c             s   s   | ]}|d kV  qdS )r   Nr   )r   r   r   r   r    r   E  s    c             s   s   | ]}t |tV  qd S )N)rz   r{   )r   r   r   r   r    r   H  s    c             s   s   | ]}t |tV  qd S )N)rz   r   )r   r   r   r   r    r   J  s    c             s   s   | ]}t |tV  qd S )N)rz   r   )r   r   r   r   r    r   L  s    c             S   s&   g | ]}t |tr|jd dn|qS )asciireplace)rz   r   encode)r   r   r   r   r    
<listcomp>Q  s   z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c             S   s"   g | ]}t |trt|n|qS r   )rz   r   r{   )r   r   r   r   r    r   U  s    c             3   s   | ]} j |V  qd S )N)Zcvt_enum)r   r}   )infor   r    r   Y  s    r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   r   r   r   r   r   rz   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   r}   r   Z	basetypesvaluesis_ifddestr   )r   r    r   ,  s^    

"zImageFileDirectory_v2._setitemc             C   s.   | j j|d  | jj|d  | jj|d  d S )N)r   popr   r   )r|   r   r   r   r    __delitem__|  s    z!ImageFileDirectory_v2.__delitem__c             C   s   t t| jt| jB S )N)iterr   r   r   )r|   r   r   r    __iter__  s    zImageFileDirectory_v2.__iter__c             C   s   t j| j| |S )N)structunpackr   )r|   fmtr   r   r   r    r     s    zImageFileDirectory_v2._unpackc             G   s   t j| j| f| S )N)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jdr2| jdd  j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jd  d fdd	ft|<  fddt|< d S )	Nr   )r   =Tc                s   | j djt|  |S )Nz{}{})r   formatr   )r|   r   r   )r   r   r   r    r     s    z7ImageFileDirectory_v2._register_basic.<locals>.<lambda>c                s   dj  fdd|D S )N    c             3   s   | ]}j  |V  qd S )N)r   )r   r}   )r   r|   r   r    r     s    zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>)join)r|   r   )r   )r|   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 longr   r{   ddoubler   Tc             C   s   |S )Nr   )r|   r   r   r   r   r    	load_byte  s    zImageFileDirectory_v2.load_bytec             C   s   |S )Nr   )r|   r   r   r   r    
write_byte  s    z ImageFileDirectory_v2.write_byter   c             C   s"   |j dr|d d }|jddS )N    r   zlatin-1r   rg   )endswithdecode)r|   r   r   r   r   r    load_string  s    
z!ImageFileDirectory_v2.load_stringc             C   s   d|j dd d S )Nr  r   r   r  )r   )r|   r}   r   r   r    write_string  s    z"ImageFileDirectory_v2.write_stringr   r   c                sV   | j dj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 )N)ri   )r   r  )r   r   r    combine  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec             3   s   | ]\}} ||V  qd S )Nr   )r   numdenom)r  r   r    r     s    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j  fdd|D S )Nr  c             3   s"   | ]} j dt|d V  qdS )2Lr   r:   r   N)r$  l        l    )r   ro   )r   rt   )r|   r   r    r     s    z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>)r  )r|   r   r   )r|   r    write_rational  s    z$ImageFileDirectory_v2.write_rationalr   c             C   s   |S )Nr   )r|   r   r   r   r   r    load_undefined  s    z$ImageFileDirectory_v2.load_undefinedc             C   s   |S )Nr   )r|   r}   r   r   r    write_undefined  s    z%ImageFileDirectory_v2.write_undefined
   c                sV   | j dj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 )N)ri   )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    r     s    z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   )r   r
  r   r   r!  )r|   r   r   r"  r   )r  r   r    load_signed_rational  s    z*ImageFileDirectory_v2.load_signed_rationalc                s   dj  fdd|D S )Nr  c             3   s$   | ]} j dt|dd	 V  qdS )
2lr      r   N)r*  l        il        i   )r   ru   )r   rt   )r|   r   r    r     s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>)r  )r|   r   r   )r|   r    write_signed_rational  s    
z+ImageFileDirectory_v2.write_signed_rationalc             C   s4   |j |}t||kr0td| dt| d|S )Nz&Corrupt EXIF data.  Expecting to read z bytes but only got z. )readr   OSError)r|   fpr   retr   r   r    _ensure_read  s
    
z"ImageFileDirectory_v2._ensure_readc             C   s  | j   |j | _yАxt| jd| j|dd D ]}| jd| j|d\}}}}tj|| jj	}t
j|d}d| d| d	| d| d
	}	y| j| \}
}W n* tk
r   tj|	d|   w6Y nX ||
 }|dkr.|j }| jd|\}|	d| d| 7 }	|j| tj||}|j| n|d | }t||krttjd| dt| d|  tj|	 q6|stj|	 q6|| j|< || j|< |	d|dkrd| nt| 7 }	tj|	 q6W | jd| j|d\| _W n0 tk
r }	 ztjt|	 d S d }	~	X nX d S )Nr  r   r   HHL4sr2   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   ranger   r1  r   r   r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readr   r   r   r   r   r   r   r.  r   )r|   r/  ir   r   countr   tagnametypnamemsgZ	unit_sizer   r   hereoffsetr   r   r    load  sN    
&





zImageFileDirectory_v2.loadr   c             C   s0  | j dt| j}g }|t| t| jd  d }d }xt| jj D ]\}}|tkrdt|}| jj|}tj	d| d| dt
|  |tjkot|t}|r| jdkrd}	nd	}	t|	|d
}
| j| }x|j D ]\}}||
|< qW |
j|}n*t|tr|n|f}| j| | f| }tj|| jj}|r@dn
tj|d}d| d| d| d| d	}|dt|dkrdt| nt| 7 }tj	| |rd}n(|tjtjtjgkrt|}nt|}t|dkr|j||||jdddf qJ|j|||| j d||f |t|d d d 7 }qJW |d k	r|| \}}}}}|r`td| j d| jd|d | }|||||f||< x\|D ]T\}}}}}tj	| d| d| dt
| dt
| 	 || j d||||7 }qW |d7 }x6|D ].\}}}}}||7 }t|d@ r|d7 }qW |S )Nr  r2   r   zTag z, Type: z	, Value: r   s   II*    s   MM *   )r   ifdr3  zsave: z (z
) - type: r4  z
 - value: r5   z<table: %d bytes>r   r  r  r&   r   z&multistrip support not yet implementedr   r  r2  s       ) r   r   r   sortedr   STRIPOFFSETSr   r7  r9  r:  r   r   r   rz   r   r   r   tobytesr   r  r   r   r   r   r   r   r   r   appendljustNotImplementedErrorr   )r|   rC  resultentriesZstripoffsetsr   r}   r   r   r   rE  r   Zifd_tagZ	ifd_valuer   r?  r@  rA  r>  r   r   r    rH  6  sf     

&


.zImageFileDirectory_v2.tobytesc             C   sN   |j  dkr&|j| j| jddd  |j  }| j|}|j| |t| S )Nr   ZHL*   r   )r5  writer   r   rH  r   )r|   r/  rC  rL  r   r   r    save  s    

zImageFileDirectory_v2.save)r   NN)T)T)T)T)T)r   )2r   r   r   r   r~   r   re   rC  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,  r1  rD  rH  rP  r   r   r   r    r     sf   ;
P






	7
Lr   r  r   r   Zwrite_c                   sz   e Zd ZU dZ fddZedd Zedd Ze	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)superr~   r   )r|   r   kwargs)	__class__r   r    r~     s    zImageFileDirectory_v1.__init__c             C   s   | j S )N)r   )r|   r   r   r    r     s    zImageFileDirectory_v1.<lambda>c             C   s   | j S )N)r   )r|   r   r   r    r     s    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`

        )re   )re   r   r   r   )clsoriginalrE  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`

        )re   )r   re   r   r   r   r   )r|   rE  r   r   r    to_v2  s
    zImageFileDirectory_v1.to_v2c             C   s   || j kp|| jkS )N)r   r   )r|   r   r   r   r    r     s    z"ImageFileDirectory_v1.__contains__c             C   s   t t| jt| jB S )N)r   r   r   r   )r|   r   r   r    r     s    zImageFileDirectory_v1.__len__c             C   s   t t| jt| jB S )N)r   r   r   r   )r|   r   r   r    r     s    zImageFileDirectory_v1.__iter__c             C   s    xdD ]}| j ||| qW d S )NFT)FT)r   )r|   r   r}   r   r   r   r    r     s    
z!ImageFileDirectory_v1.__setitem__c             C   sr   || j krP| j| }| j| }| j| \}}x"dD ]}| j||| ||| q2W | j | }t|ttfsn|f}|S )NFT)FT)r   r   r   r   r   rz   r   r   )r|   r   r   r   r   r   legacyrk   r   r   r    r     s    




z!ImageFileDirectory_v1.__getitem__)r   r   r   r   r~   r   tagsZtagdatar   r   classmethodr[  r\  r   r   r   r   r   __classcell__r   r   )rX  r    rU    s   
rU  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 j|| d S )N)tag_v2r   rV  r~   )r|   r/  filename)rX  r   r    r~     s    zTiffImageFile.__init__c             C   s   | j jd}t|| _d| _| jj | _| _d| _| j | _	g | _
d| _tjd tjd| j  tjdt|  | jd dS )	z#Open the first image in a TIFF filer   Nr   z*** TiffImageFile._open ***z- __first: z- ifh: r   rg   )r/  r-  r   rb  rE  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_TiffImageFile__fp
_frame_pos	_n_framesr9  r:  r   _seek)r|   r   r   r   r    _open
  s    

zTiffImageFile._openc             C   sT   | j d krN| j }| jt| j x | j d krB| j| j d  q$W | j| | j S )Nr   )rh  r5  ri  r   rg  r;  )r|   currentr   r   r    n_frames#  s    

zTiffImageFile.n_framesc             C   s<   | j |sdS | j| tj| j tjj| j| j| _dS )z%Select a given frame as current imageN)	Z_seek_checkri  r   Z_decompression_bomb_checkr   corenewmodeim)r|   framer   r   r    r;  -  s
    

zTiffImageFile.seekc          	   C   s@  | j | _| jj  xt| j|kr| js0tdtjd| d| j	 d| j d| jj   | jj
| j | jj| j tjd| jj   | 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j| j tj| j | _| _|| _	| 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   )rf  r/  r5  r   rg  rd  EOFErrorr9  r:  re  r;  rI  rb  rD  r   rh  is_animatedrU  r[  r   rE  _setup)r|   rq  r   r   r    ri  8  s0    
(


zTiffImageFile._seekc             C   s   | j S )zReturn the current frame number)re  )r|   r   r   r    r5  \  s    zTiffImageFile.tellc             C   s   d| j kr| j| j d S i S )z
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.
        :returns: XMP tags in a dictionary.
        i  )rb  Z_getxmp)r|   r   r   r    getxmp`  s    zTiffImageFile.getxmpc                s   | j r| jr| j S t j S )N)tileuse_load_libtiff_load_libtiffrV  rD  )r|   )rX  r   r    rD  h  s    zTiffImageFile.loadc             C   s   | j rPtjtjtjtjtjtjtjdj	| j }|d k	rP| j
j|| _
| j
j| _| jsd| _| jj  | j }x&tjj D ]}||krqz|j| qzW d 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_90r7  rp  Z	transposer   _sizers  !_close_exclusive_fp_after_loadingr/  r5  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 j|  | j  t| jdks*td| jd d }t| jd d }y6t| jdoft	j
| jj }t| jdr~| jj  W n tk
r   d}Y nX |r||d< t j| jd	t|| j}y|j| j| W n, tk
r } ztd
|W Y dd}~X nX | jo| j }t| jdr<tjd |j| jj \}}n\|rntjd |s^| jjd |jd\}}n*tjd | jjd |j| jj \}}g | _d| _| j  |r| jj  d| _|dk rt|t j 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   rD  Zload_preparer   rv  r.  rR  hasattrr/  osdupr  r  Z_getdecoderro  r   Zdecoderconfigsetimagerp  r   Z_exclusive_fprs  r9  r:  r  r  r;  r-  readonlyr  close)	r|   Zextentsr   r/  decodereZclose_self_fpnerrr   r   r    rx    sR    






zTiffImageFile._load_libtiffc             C   s  d| j krtdt| j jtd | _| j jtd| _| j jtd}| jdkrRd}| j jt	d}t
jd t
jd| j  t
jd	|  t
jd
| j  t
jd|  t
jd| jjd  t| j jt}t| j jt}||f| _t
jd| j  | j jtd4}t|dkrFt|t|  ko:dkn  rFd5}| j jtd6}| j jtf }|d7krrd}n|dkrd}nd}|t|7 }|t|krt|dkr|| }| j jt| jdkr|d8krdnd}	t||	krtd| j j|||||f}
t
jd|
  yt|
 \| _}W n8 tk
rb } zt
jd td|W Y dd}~X nX t
jd|  t
jd| j  | j| jd< | j jtd}| j jt d}|r8|r8| j jt!}|dkr||f| jd< nX|dkr|d |d f| jd< n6|dkr*||f| jd< ||f| jd< n||f| jd< d } }}g | _"t#pX| jdk| _$| j$r:|dkr|
dd d9 |
dd  }
t
jd|
  t|
 \| _}|d krd!}d"|kr|j%d"d#}d$|kr|j%d$d#}|dkr| jd%kr| jdkrd&}|| jd'| j j&f}| j"j'd(dd||fd|f nXt(| j ksRt)| j krt(| j kr| j t( }| j jt*|}| jd }n"| j t) }| j jd)}| j jd*}x|D ]}|| |kr|t+| d }nd}|}| jdkr|| }|| }|t|df}| j"j'| j||t|| |t|| |f||f || }|| jd krd||  }}|| jd krd }}|d7 }qW nt
jd+ tdt,| j kr| j t, | jd,< | jd:krd/d0 | j t- D }t.j/d1d2j0|| _1| j jd3| _2dS );z-Setup this image object based on current tagsi  z+Windows Media Photo files not yet supportedr   r   r   r   z*** Summary ***z- compression: z- photometric_interpretation: z- planar_configuration: z- fill_order: z- YCbCr subsampling: i  z- size: r   r   r   r   r   zunknown data organizationzformat key: z- unsupported formatzunknown pixel modeNz- raw mode: z- pil mode: compressiondpigRQ@
resolutionr   zI;16zI;16Nz;16Bz;16Nz;16Lr   rB   Fr  iB  iC  z- unsupported data organizationicc_profilerV   r]   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  )r   )r   )r   )r   r   r   )r   r   )r   )rV   r]   )3rb  r.  COMPRESSION_INFOr7  COMPRESSION_compressionPLANAR_CONFIGURATION_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERr9  r:  r   r   
IMAGEWIDTHIMAGELENGTHrz  r   SAMPLEFORMATr   rs   rr   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELr   re   	OPEN_INFOro  r8  r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITrv  READ_LIBTIFFrw  r   rC  rI  rG  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layerr   offsetsr  wrC  strideZtile_rawmoder  r   r   r    rt    s    



2

 








 



zTiffImageFile._setupc             C   sB   z4y| j | jkr| j j  W n tk
r0   Y nX W d d | _ X d S )N)rf  r/  r  AttributeError)r|   r   r   r    
_close__fp  s    
zTiffImageFile._close__fp)NN)r   r   r   r
  format_descriptionr{  r~   rj  r   rl  r;  ri  r5  ru  rD  r  rx  rt  r  r`  r   r   )rX  r    ra    s    	
$U Qra  YCbCr)r"   r&   rA   rV   r]   r7   zI;16zI;16Sr;   rB   rE   rD   r_   r  rc   zI;32BSzI;16BzI;16BSzF;32BFc       -      C   sN  yt | j \}}}}}}W n6 tk
rP }	 ztd| j d|	W Y d d }	~	X nX t|d}
| j}| j}|jd| jjd}|d krd}n|dkrd}n|dkrd	}t	p|dk}t
| d
d|
t< | jd |
t< | jd |
t< d|kr|d }n:d|kr$|d }t|tr(tj }|j| |}ni }tjdt|  t|trN|j }xv|D ]n}t|tjr|tjj kr|j||
|< n|j||
|< y|j| |
j|< W n tk
r   Y nX qTW t| drxFt t!t"t#t$t%fD ]2}|| j&kr| j&| |
|< | j&j| |
j|< qW |jd| j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~|| |
|< q~W |jd}|rd|
t < |d |
t!< |d |
t"< |d?kr||
t-< t.|dkrt.||
t/< |d k	r||
t0< |dkr"||
t1< t2|
kr6||
t2< n| jd@kr|
t2 dkr| jdkr| j3 }|j }xLt4|j5D ]>}x6t4|j6D ](}|||f dkrdnd|||f< qW qxW |} n
t7j8| } | jdAkr| j9j:d"d#}t;d$d% |D |
t<< t.|| jd |d  d& d'  }|rl|dkr0dnt=t>| | jd }|dkrvt=|d& d' d' | jd }n
| jd }|dkrd}|dkrdn|| }| jd | d | }||
t?< |dBkrtj@|
jtA< |f|d  || jd  ||d   f |
tA< t;t4d|| ||
tB< tCj|d|
tD< | jd)kr\x*tEdCtFdDijG D ]\}}|
jH|| qBW |rd+|kr|d+ } t| tI s| dk s| d,krtJd-|dkrtJd.| |
tK< tjd/ tjd0tL|
jG   d}!t|d1ry|jMd tNjO|jP }!W n tQjRk
r   Y nX i }"tFt1tAtBtStTg}#i }$|d |$t-< i }%t| d2r\| jUj }%xtVjW|
jG t
| di jG |%jG D ]\}}|tjXkrtjYjZsq||
jkr|
j| |"|< n4t|tIt[t\tfsؐqntj]|j^}&|&r|&|"|< ||$kr||#krt|t\r(|j_d3d4d5 |$|< n"t|t`rBt[||$|< n||$|< qW tjd6tL|$jG   | jdEkrvd9}t|$jG }'|'ja  |||!||'|"f}(tjb| jd:|(|}	|	jc| j9dF| j  x.|	j_dG\})}*}+|!s|jd|+ |*rP qW |*dk r:td<|* d=n.|
je|},tfjg| |ddH| j |,||dffg d>|krJ|
| _hd S )INzcannot write mode z as TIFF)re   r  r   r   r   r   r   r  r   r   Ztiffinfor  zTiffinfo Keys: %srb  r  descriptionr  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr  r   r"   r&      rV   r]   rB   zRGB;Lc             s   s   | ]}|d  V  qdS )r   Nr   )r   r   r   r   r    r   R  s    z_save.<locals>.<genexpr>r   r   r5   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I;16BI;16zI;16Nr  i   zencoder error z when writing image file_debug_multipage)r   )r"   r&   )rV   r]   i   )r   r   )r   r  r  r  r  r  )r  r  )r   r   i @  )r   r   )i	SAVE_INFOro  r8  r.  r   encoderinfoencoderconfigr7  r   WRITE_LIBTIFFr   r  r   r  r  rz   r   r   ZExifrD  r9  r:  rR  rU  r\  r   r|  r}  r~  r   r   r  r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKXMPrb  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  r   r  r  r  r  copyr6  heightwidthr	   invertrp  Z
getpaletter   r  rr   
STRIP_SIZEr  r   STRIPBYTECOUNTSrG  COMPRESSION_INFO_REVr  YCBCRSUBSAMPLINGREFERENCEBLACKWHITEr   
setdefaultr   r   JPEGQUALITYrF  r;  r  r  r  ioUnsupportedOperationTRANSFERFUNCTIONSUBIFDr   	itertoolschainZLIBTIFF_CORErm  Zlibtiff_support_custom_tagsr{   r   r   r   r   ri   sortZ_getencoderr  rO  rP  r   _saver  )-rp  r/  rc  r  re   r  r
  bitsextrar  rE  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   r}   r  _fptypesZ	blocklistZattsZ
legacy_ifdr   r^  r   r  sr  rC  r   r   r    r    sp   &












.
""



"
"




&



 
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j | _| j  d S )Nr-  FTzw+bzr+b)	r  r   close_fpr   openr.  r5  	beginningsetup)r|   fnrn  r   r   r    r~     s    
zAppendingTiffWriter.__init__c             C   s   | j j| jtj d | _d| _| j jd | _}|s>d| _	d S d| _	|dkrX| j
d n|dkrl| j
d ntd	| j  | j  d S )
Nr   r   TFs   II* r   s   MM *r   zInvalid TIFF file header)r   r;  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 | jjd}|s,d S || jkr>td| j }|| j7 }| jj| j | j	| | jj| | j
  d S )Nr   z1IIMM of new page doesn't match IIMM of first page)r  r   r;  r  r-  r  r  readLongr  	writeLongfixIFD)r|   r  	IFDoffsetr   r   r    finalize'  s    


zAppendingTiffWriter.finalizec             C   s   | j   | j  d S )N)r  r  )r|   r   r   r    newFrame>  s    zAppendingTiffWriter.newFramec             C   s   | S )Nr   )r|   r   r   r    	__enter__C  s    zAppendingTiffWriter.__enter__c             C   s   | j r| j  dS )NF)r  r  )r|   exc_type	exc_value	tracebackr   r   r    __exit__F  s    zAppendingTiffWriter.__exit__c             C   s   | j j | j S )N)r   r5  r  )r|   r   r   r    r5  K  s    zAppendingTiffWriter.tellc             C   s*   |t jkr|| j7 }| jj|| | j S )N)r  r  r  r   r;  r5  )r|   rC  whencer   r   r    r;  N  s    

zAppendingTiffWriter.seekc             C   s^   | j jdtj | j j }d|d  }d|  k o8dk n  rN| j jt| | j j | _d S )Nr   r5   )r   r;  r  SEEK_ENDr5  rO  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   sT   xN| j  }|dkr$| jj d | _P | jj| | j }| jj|d tj qW d S )Nr   r   r2   )r  r   r5  r  r;  	readShortr  SEEK_CUR)r|   r  numTagsr   r   r    r  e  s    zAppendingTiffWriter.skipIFDsc             C   s   | j j|S )N)r   rO  )r|   r   r   r   r    rO  p  s    zAppendingTiffWriter.writec             C   s   t j| j| jjd\}|S )Nr   )r   r   r  r   r-  )r|   r}   r   r   r    r  s  s    zAppendingTiffWriter.readShortc             C   s   t j| j| jjd\}|S )Nr   )r   r   r  r   r-  )r|   r}   r   r   r    r  w  s    zAppendingTiffWriter.readLongc             C   sJ   | j jdtj | j jtj| j|}|d k	rF|dkrFtd| dd S )Nr   r   zwrote only z bytes but wanted 4)	r   r;  r  r  rO  r   r   r  r  )r|   r}   bytesWrittenr   r   r    rewriteLastShortToLong{  s    z*AppendingTiffWriter.rewriteLastShortToLongc             C   sJ   | j jdtj | j jtj| j|}|d k	rF|dkrFtd| dd S )Nr   zwrote only z bytes but wanted 2r
  )	r   r;  r  r  rO  r   r   r  r  )r|   r}   r  r   r   r    rewriteLastShort  s    z$AppendingTiffWriter.rewriteLastShortc             C   sJ   | j jdtj | j jtj| j|}|d k	rF|dkrFtd| dd S )Nr   zwrote only z bytes but wanted 4)	r   r;  r  r  rO  r   r   r  r  )r|   r}   r  r   r   r    rewriteLastLong  s    z#AppendingTiffWriter.rewriteLastLongc             C   s:   | j jtj| j|}|d k	r6|dkr6td| dd S )Nr   zwrote only z bytes but wanted 2)r   rO  r   r   r  r  )r|   r}   r  r   r   r    
writeShort  s    zAppendingTiffWriter.writeShortc             C   s:   | j jtj| j|}|d k	r6|dkr6td| dd S )Nr   zwrote only z bytes but wanted 4)r   rO  r   r   r  r  )r|   r}   r  r   r   r    r    s    zAppendingTiffWriter.writeLongc             C   s   | j   | jj  d S )N)r  r   r  )r|   r   r   r    r    s    zAppendingTiffWriter.closec             C   s  | j  }xt|D ]}tj| j| jjd\}}}| j| }|| }|dk}|sl| j }	|	| j	7 }	| j
|	 || jkr| jj }
|r| j||dk|dkd | jj|
d  n0| jj|	 | j||dk|dkd | jj|
 d  }	}
q|r| jjdtj qW d S )Nr   r   r   )isShortisLong)r  r6  r   r   r  r   r-  
fieldSizesr  r  r  Tagsr5  
fixOffsetsr;  r  r  )r|   r	  r=  r   Z	fieldTyper>  Z	fieldSizeZ	totalSizeZisLocalrC  ZcurPosr   r   r    r    s.    





zAppendingTiffWriter.fixIFDc             C   s   | r| rt dxt|D ]}|r.| j n| j }|| j7 }|r|dkr|dkr\t d| j| | jjdtj	 | j
tj | jjdtj	 q|r| j| q| j| qW d S )Nz offset is neither short nor longi   r   znot implementedr(  r   i)r  r6  r  r  r  r  r   r;  r  r  r  r   r   r  r  )r|   r>  r  r  r=  rC  r   r   r    r    s    

zAppendingTiffWriter.fixOffsetsN)F)FF)r   r   r   r  r  r~   r  r  r  r  r  r5  r  r  r;  r  r  r  rO  r  r  r  r  r  r  r  r  r  r  r   r   r   r    r    sH   	

#r  c             C   s   | j j }| j}t|jdg }t| d r>| r>t| ||S | j }zt|t}xl| g| D ]^}||_ ||_t|ds~d}	n|j	}	x6t
|	D ]*}
|j|
 |j  t||| |j  qW q^W W d Q R X W d | j| X d S )Nappend_imagesrl  r   )r  r  r  rR  r7  r  r  r5  r  rl  r6  r;  rD  r  )rp  r/  rc  r  r  r  Zcur_idxtfZimsZnfrr  r   r   r    	_save_all  s(    



r  z.tifz.tiffz
image/tiff)r   )r   )r"   r#   )r   )r   )r"   r#   )r   )r   )r"   r$   )r   )r   )r"   r$   )r   )r   )r"   r"   )r   )r   )r"   r"   )r   )r   )r"   r%   )r   )r   )r"   r%   )r   )r   )r&   r'   )r   )r   )r&   r'   )r   )r   )r&   r(   )r   )r   )r&   r(   )r   )r   )r&   r)   )r   )r   )r&   r)   )r   )r   )r&   r*   )r   )r   )r&   r*   )r   )r   )r&   r+   )r   )r   )r&   r+   )r   )r   )r&   r,   )r   )r   )r&   r,   )r   )r   )r&   r-   )r   )r   )r&   r-   )r   )r   )r&   r.   )r   )r   )r&   r.   )r   )r   )r&   r/   )r   )r   )r&   r/   )r   )r   )r&   r0   )r   )r   )r&   r0   )r   )r   )r&   r&   )r   )r   )r&   r&   )r   )r   )r&   r1   )r   )r   )r&   r1   )r   )r2   )r3   r4   )r   )r5   )r3   r3   )r   )r5   )r6   r6   )r   )r5   )r7   r8   )r   )r5   )r7   r9   )r   )r:   )r;   r<   )r   )r:   )r;   r=   )r   )r:   )r7   r>   )r   )r:   )r7   r?   )r   )r:   )r7   r@   )r   )r:   )r;   r<   )r   )r:   )r;   r=   )r   )r   r   )r   )rA   rA   )r   )r   r   )r   )rA   rA   )r   )r   r   r   )rB   rB   )r   )r   r   r   )rB   rB   )r   )r   r   r   )rB   rC   )r   )r   r   r   )rB   rC   )r   )r   r   r   r   )rD   rD   )r   )r   r   r   r   )rD   rD   )r   )r   r   r   r   )r   )rE   rE   )r   )r   r   r   r   )r   )rE   rE   )r   )r   r   r   r   r   )r   r   )rE   rF   )r   )r   r   r   r   r   )r   r   )rE   rF   )r   )r   r   r   r   r   r   )r   r   r   )rE   rG   )r   )r   r   r   r   r   r   )r   r   r   )rE   rG   )r   )r   r   r   r   )r   )rD   rH   )r   )r   r   r   r   )r   )rD   rH   )r   )r   r   r   r   r   )r   r   )rD   rI   )r   )r   r   r   r   r   )r   r   )rD   rI   )r   )r   r   r   r   r   r   )r   r   r   )rD   rJ   )r   )r   r   r   r   r   r   )r   r   r   )rD   rJ   )r   )r   r   r   r   )r   )rD   rD   )r   )r   r   r   r   )r   )rD   rD   )r   )r   r   r   r   r   )r   r   )rD   rK   )r   )r   r   r   r   r   )r   r   )rD   rK   )r   )r   r   r   r   r   r   )r   r   r   )rD   rL   )r   )r   r   r   r   r   r   )r   r   r   )rD   rL   )r   )r   r   r   r   )rM   )rD   rD   )r   )r   r   r   r   )rM   )rD   rD   )r   )r5   r5   r5   )rB   rN   )r   )r5   r5   r5   )rB   rO   )r   )r5   r5   r5   r5   )rD   rP   )r   )r5   r5   r5   r5   )rD   rQ   )r   )r5   r5   r5   r5   )r   )rE   rR   )r   )r5   r5   r5   r5   )r   )rE   rS   )r   )r5   r5   r5   r5   )r   )rD   rT   )r   )r5   r5   r5   r5   )r   )rD   rU   )r   )r5   r5   r5   r5   )r   )rD   rP   )r   )r5   r5   r5   r5   )r   )rD   rQ   )r   )r   )rV   rW   )r   )r   )rV   rW   )r   )r   )rV   rX   )r   )r   )rV   rX   )r   )r   )rV   rY   )r   )r   )rV   rY   )r   )r   )rV   rZ   )r   )r   )rV   rZ   )r   )r   )rV   r[   )r   )r   )rV   r[   )r   )r   )rV   r\   )r   )r   )rV   r\   )r   )r   )rV   rV   )r   )r   )rV   rV   )r   )r   r   )r   )r]   r]   )r   )r   r   )r   )r]   r]   )r   )r   )rV   r^   )r   )r   )rV   r^   )r   )r   r   r   r   )r_   r_   )r   )r   r   r   r   )r_   r_   )r   )r   r   r   r   r   )r   )r_   r`   )r   )r   r   r   r   r   )r   )r_   r`   )r   )r   r   r   r   r   r   )r   r   )r_   ra   )r   )r   r   r   r   r   r   )r   r   )r_   ra   )r   )r5   r5   r5   r5   )r_   rb   )r   )r   r   r   )rB   rE   )r   )r   r   r   )rB   rE   )r   )r   r   r   )rc   rc   )r   )r   r   r   )rc   rc   )r   )r   )r   r   )r   )r   r   )r:   )r5   )r5   )r:   )r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   )r   r   r   )r:   )r5   )r5   )r:   )ar  r  loggingr  r   r   collections.abcr   Z	fractionsr   Znumbersr   r    r   r   r	   r
   r   _binaryr   r   	getLoggerr   r9  r  r  ZIFD_LEGACY_APIr  r   r   r  r  r  r  r  r  r  rG  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  rd   rf   ro   ru   r   r  ri   r   r  r   r   setattrrU  ZImageFileDirectoryra  r  r  r  r  Zregister_openr
  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer   r   r   r    <module>)   s  
   o\   M   o