/ lib / PIL / TiffImagePlugin.pyc
TiffImagePlugin.pyc
  1  o

  2  Y��c�3�@s�ddlZddlZddlZddlZddlZddlZddlZddlmZddl	m
  3  Z
  4  ddlmZm
Z
ddlmZmZmZmZmZddlmZddlmZdd	lmZdd
  5  lmZe�e�ZdZdZdZ d
Z!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3d Z4d!Z5d"Z6d#Z7d$Z8d%Z9d&Z:d'Z;d(Z<d)Z=d*Z>d+Z?d,Z@d-ZAd.ZBd/ZCd0ZDd1ZEd2ZFd3ZGd4ZHd5ZId6ZJd7ZKidd8�d9d:�d;d<�d=d>�d?d@�dAdB�dCdD�dEdF�dGdH�dIdJ�dKdL�dMdN�dOdP�dQdR�dSdT�dUdV�dWdX�ZLdYdZ�eL�M�D�ZNie"dd[dd[d\fd]�e#dd[dd[d\fd]�e"dd[d9d[d\fd^�e#dd[d9d[d\fd^�e"dd[dd[d\fd_�e#dd[dd[d\fd_�e"dd[d9d[d\fd`�e#dd[d9d[d\fd`�e"dd[ddad\fdb�e#dd[ddad\fdb�e"dd[d9dad\fdc�e#dd[d9dad\fdc�e"dd[ddad\fdd�e#dd[ddad\fdd�e"dd[d9dad\fde�e#dd[d9dad\fde�e"dd[ddfd\fdg�ie#dd[ddfd\fdg�e"dd[d9dfd\fdh�e#dd[d9dfd\fdh�e"dd[ddfd\fdi�e#dd[ddfd\fdi�e"dd[d9dfd\fdj�e#dd[d9dfd\fdj�e"dd[ddkd\fdl�e#dd[ddkd\fdl�e"dd[d9dkd\fdm�e#dd[d9dkd\fdm�e"dd[ddkd\fdn�e#dd[ddkd\fdn�e"dd[d9dkd\fdo�e#dd[d9dkd\fdo�e"dd[ddpd\fdq�e"dd[ddrd\fds��ie"dd[ddrd\fds�e#dd[ddrd\fdt�e"dd[d9drd\fdu�e"ddaddrd\fdv�e#ddaddrd\fdw�e"ddxddyd\fdz�e#ddxddyd\fd{�e"dd[ddyd\fd|�e"ddaddyd\fd}�e#ddaddyd\fd~�e"ddxddyd\fdz�e#ddxddyd\fd{�e"dd[dddafd��e#dd[dddafd��e"d9d[dd�d\fd��e#d9d[dd�d\fd��e"d9d[d9d�d\fd���ie#d9d[d9d�d\fd��e"d9d[dd�d\fd��e#d9d[dd�d\fd��e"d9d[dd�d�fd��e#d9d[dd�d�fd��e"d9d[dd�d�fd��e#d9d[dd�d�fd��e"d9d[dd�d�fd��e#d9d[dd�d�fd��e"d9d[dd�d[fd��e#d9d[dd�d[fd��e"d9d[dd�d�fd��e#d9d[dd�d�fd��e"d9d[dd�d�fd��e#d9d[dd�d�fd��e"d9d[dd�dafd��e#d9d[dd�dafd���ie"d9d[dd�d�fd��e#d9d[dd�d�fd��e"d9d[dd�d�fd��e#d9d[dd�d�fd��e"d9d[dd�d�fd��e#d9d[dd�d�fd��e"d9d[dd�d\fd��e#d9d[dd�d\fd��e"d9d[dd�d\fd��e#d9d[dd�d\fd��e"d9d[dd�d�fd��e#d9d[dd�d�fd��e"d9d[dd�d[fd��e#d9d[dd�d[fd��e"d9d[dd�dafd��e#d9d[dd�dafd��e"d;d[dd[d\fd���ie#d;d[dd[d\fd��e"d;d[d9d[d\fd��e#d;d[d9d[d\fd��e"d;d[ddad\fd��e#d;d[ddad\fd��e"d;d[d9dad\fd��e#d;d[d9dad\fd��e"d;d[ddfd\fd��e#d;d[ddfd\fd��e"d;d[d9dfd\fd��e#d;d[d9dfd\fd��e"d;d[ddkd\fd��e#d;d[ddkd\fd��e"d;d[dddafd��e#d;d[dddafd��e"d;d[d9dkd\fd��e#d;d[d9dkd\fd���e"d?d[dd�d\fd�e#d?d[dd�d\fd�e"d?d[dd�d�fd�e#d?d[dd�d�fd�e"d?d[dd�d�fd�e#d?d[dd�d�fd�e"d?d[dd�d\fd�e"dAd[dd�d\fd�e#dAd[dd�d\fd�e"dEd[dd�d\fd�e#dEd[dd�d\fd�i�ZOePd�d��eO�Q�D��ZRgd��ZSd�d��ZTd�d��ZUd�d��ZViZWiZXGd�d��d�e
�ZYGd�d��d�e�ZZeWeZ_WeXeZ_Xe�M�D]!\Z[Z\e\�]d�d��Z\e^eZd�e\eWe[d�e^eZd�e\eXe[��q*[W[X[[[\Gd�dÄd�eZ�Z_e_Z`Gd�dńd�ej�Zaid�d�e"ddd[df�d�d�e"dddkdf�d�d�e"dddd9f�d�d�e"d;ddkdf�d�d�e"d;ddd9f�d�d�e"dd9dydf�d�d�e"dddrdf�d�d�e"dd9drdf�d�d�e"dd;dydf�d�d�e"d9dd�df�d�d�e"d9dd�df�d�d�e"d9dd�d9f�d�d�e"d?dd�df�d�d�e"dAdd�df�d�d�e"dEdd�df�d�d�e#dd9dydf�d�d�e#dddrdf�d�e#dd9drdfd�e#dd;dydfdۜ�Zbd�d݄ZcGd�d߄d߃Zdd�d�Zee�feajgeaeT�e�heajgec�e�ieajgee�e�jeajgd�d�g�e�keajgd�dS)��N)�MutableMapping)�Fraction)�Number�Rational�)�Image�	ImageFile�ImageOps�ImagePalette�TiffTags)�i16be)�i32be��o8��TYPESFT�sIIsMM�iiiii
  6  i�iiiiiii(i-i1i2i;i=i@iBiC�DiEiJiRiSi[iii��i���I�is�ii�i�ii��i���raw�Z
  7  tiff_ccitt�Zgroup3��group4�Ztiff_lzw��	tiff_jpeg��jpeg��tiff_adobe_deflatei�Ztiff_raw_16i��packbitsi)�Ztiff_thunderscani���tiff_deflateit�Ztiff_sgilogiu�Z
tiff_sgilog24im��lzmaiP��zstdiQ��webpcCsi|]\}}||�qS�r()�.0�k�vr(r(��C:\Users\Jacks.GUTTSPC\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\PIL\TiffImagePlugin.py�
  8  <dictcomp>�sr-�rr()�1z1;I)r/z1;IR)r/r/)r/z1;R)r)�LzL;2I)r0zL;2IR)r0zL;2)r0zL;2R)r)r0zL;4I)r0zL;4IR)r0zL;4)r0zL;4R)r!)r0zL;I)r0zL;IR)r0r0)r0zL;R)�)�I;16zI;12)�)r2r2)�I;16Br4)r2zI;16R)�I�I;16S)r5�I;16BS)r)� )�F�F;32F)r9�F;32BF)r5zI;32N)r5�I;32S)r5�I;32BS)r!r!)�LAr>)r!r!r!)�RGBr?)r?zRGB;R)r!r!r!r!)�RGBAr@�r)�RGBXrB)r!r!r!r!r!�rr)rBZRGBXX)r!r!r!r!r!r!)rrr)rBZRGBXXX)r@�RGBa)rr)r@ZRGBaX)rrr)r@ZRGBaXX)rr)r@ZRGBAX)rrr)r@ZRGBAXX)i�)r3r3r3)r?zRGB;16L)r?zRGB;16B)r3r3r3r3)r@zRGBA;16L)r@zRGBA;16B)rBzRGBX;16L)rBzRGBX;16B)r@zRGBa;16L)r@zRGBa;16B)�PzP;1)rEzP;1R)rEzP;2)rEzP;2R)rEzP;4)rEzP;4R)rErE)�PArF)rEzP;R)�CMYKrG)rGZCMYKX)rGZCMYKXX)rGzCMYK;16L)r?rB)�LABrHccs�|]	}t|d�VqdS)rN)�len)r)Zkey_tpr(r(r,�	<genexpr>��rJ)�MM*�II*sMM*sII*sMM+sII+cCs|dd�tvS�Nr)�PREFIXES��prefixr(r(r,�_accept�rRcCs<t|�dk}t|r
d|n|��|�}|r|ddd�S|S)Nr�����)�abs�IFDRational�limit_rational)�val�max_val�inv�n_dr(r(r,�_limit_rationalsr\cCsPt|�}|j|jf}t|�|krt|t|��}t|�|kr&t|�}t||�}|S�N)r�	numerator�denominator�minr\rU�max)rXrY�min_val�fracr[r(r(r,�_limit_signed_rationals
  9  rdc@sBeZdZdZ	dZd3dd�Zedd��Zedd	��Zd
 10  d�Z	dd
�Z
 11  dd�Zdd�Zdd�Z
dd�Zdd�Z	ed�Zed�Zed�Zed�Zed�Zed�Zed�Zed�Zed �Zed!�Zed"�Zed#�Zed$�Zed%�Zed&�Zed'�Zed(�Z ed)�Z!ed*�Z"ed+�Z#ed,�Z$ed-�Z%ed.�Z&ed/�Z'ed0�Z(ed1�Z)d2S)4rVz�Implements a rational class where 0/0 is a legal value to match
 12      the in the wild use of exif rationals.
 13  
 14      e.g., DigitalZoomRatio - 0.00/0.00  indicates that no digital zoom was used
 15      )�
 16  _numerator�_denominator�_valrcCs�t|t�r|j|_|j|_|j|_dSt|t�r!|j|_|j|_n||_||_|dkr2td�|_dS|dkr=t|�|_dSt||�|_dS)z�
 17          :param value: either an integer numerator, a
 18          float/rational/other number, or an IFDRational
 19          :param denominator: Optional integer denominator
 20          Nr�nanr)	�
 21  isinstancerVr^rer_rfrgr�float)�self�valuer_r(r(r,�__init__=s
 22  
 23  
 24  zIFDRational.__init__cC�|jSr])re�rkr(r(r,r^W�zIFDRational.numeratorcCrnr])rfror(r(r,r_[rpzIFDRational.denominatorcCs.|jdkr|j|jfS|j�|�}|j|jfS)z�
 25  
 26          :param max_denominator: Integer, the maximum denominator value
 27          :returns: Tuple of (numerator, denominator)
 28          r)r_r^rg�limit_denominator)rk�max_denominator�fr(r(r,rW_s
 29  zIFDRational.limit_rationalcCstt|j��Sr])�strrjrgror(r(r,�__repr__lszIFDRational.__repr__cCs
 30  |j��Sr])rg�__hash__ror(r(r,rvos
 31  zIFDRational.__hash__cCs0|j}t|t�r|j}t|t�rt|�}||kSr])rgrirVrj)rk�otherrXr(r(r,�__eq__rs
 32  
 33  zIFDRational.__eq__cCs|j|j|jgSr])rgrerfror(r(r,�__getstate__zrSzIFDRational.__getstate__cCs,t�|d�|\}}}||_||_||_dS)Nr)rVrmrgrerf)rk�statergrerfr(r(r,�__setstate__}s
 34  
 35  
 36  zIFDRational.__setstate__c��fdd�}|S)Ncst|j��|�Sr])�getattrrg)rk�args��opr(r,�delegate�rSz'IFDRational._delegate.<locals>.delegater()r�r�r(rr,�	_delegate�szIFDRational._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__Nr.)*�__name__�
 37  __module__�__qualname__�__doc__�	__slots__rm�propertyr^r_rWrurvrxryr{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,rV/sV
 38  
 39  
 40  
rVc@seZdZdZd^dd�Zedd��Zedd��Zed	d��Zej	d
 41  d��Zdd
�Z
 42  dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zeeeejd*d+fejd,d-fejd.d/fejd0d1fej d2d3fej!d4d5fej"d6d7fej#d,d-fej$d8d9fg	��ed:d:�d_d<d=��Z%ed:�d>d?��Z&ed@d:�d_dAdB��Z'ed@�dCdD��Z(edEdF�d_dGdH��Z)edE�dIdJ��Z*edKd:�d_dLdM��Z+edK�dNdO��Z,edPdF�d_dQdR��Z-edP�dSdT��Z.dUdV�Z/dWdX�Z0d`dZd[�Z1d\d]�Z2dS)a�ImageFileDirectory_v2aThis class represents a TIFF tag directory.  To speed things up, we
 43      don't decode tags unless they're asked for.
 44  
 45      Exposes a dictionary interface of the tags in the directory::
 46  
 47          ifd = ImageFileDirectory_v2()
 48          ifd[key] = 'Some Data'
 49          ifd.tagtype[key] = TiffTags.ASCII
 50          print(ifd[key])
 51          'Some Data'
 52  
 53      Individual values are returned as the strings or numbers, sequences are
 54      returned as tuples of the values.
 55  
 56      The tiff metadata type of each item is stored in a dictionary of
 57      tag types in
 58      :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types
 59      are read from a tiff file, guessed from the type added, or added
 60      manually.
 61  
 62      Data Structures:
 63  
 64          * ``self.tagtype = {}``
 65  
 66            * Key: numerical TIFF tag number
 67            * Value: integer corresponding to the data type from
 68              :py:data:`.TiffTags.TYPES`
 69  
 70            .. versionadded:: 3.0.0
 71  
 72      'Internal' data structures:
 73  
 74          * ``self._tags_v2 = {}``
 75  
 76            * Key: numerical TIFF tag number
 77            * Value: decoded data, as tuple for multiple values
 78  
 79          * ``self._tagdata = {}``
 80  
 81            * Key: numerical TIFF tag number
 82            * Value: undecoded byte string from file
 83  
 84          * ``self._tags_v1 = {}``
 85  
 86            * Key: numerical TIFF tag number
 87            * Value: decoded data in the v1 format
 88  
 89      Tags will be found in the private attributes ``self._tagdata``, and in
 90      ``self._tags_v2`` once decoded.
 91  
 92      ``self.legacy_api`` is a value for internal use, and shouldn't be changed
 93      from outside code. In cooperation with
 94      :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api``
 95      is true, then decoded tags will be populated into both ``_tags_v1`` and
 96      ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF
 97      save routine. Tags should be read from ``_tags_v1`` if
 98      ``legacy_api == true``.
 99  
100      �II*NcCs�t|�sdt|��d�}t|��|dur|n|dd�|_|jtkr&d|_n|jtkr/d|_nd}t|��|ddk|_||_i|_		|�
101  �|jrT|�d	|d
102  d��n	|�d|dd��\|_d
|_
dS)a�Initialize an ImageFileDirectory.
103  
104          To construct an ImageFileDirectory from a real file, pass the 8-byte
105          magic header to the constructor.  To only set the endianness, pass it
106          as the 'prefix' keyword argument.
107  
108          :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets
109                endianness.
110          :param prefix: Override the endianness of the file.
111          znot a TIFF file (header z not valid)Nr�>�<znot a TIFF IFD�+�Qr!r0rF)rR�repr�SyntaxError�_prefix�MM�_endian�II�_bigtiff�group�tagtype�reset�_unpack�next�_legacy_api)rk�ifhrQr��msgr(r(r,rm�s$
112  
113  ,�
114  zImageFileDirectory_v2.__init__cCrnr])r�ror(r(r,�<lambda>�zImageFileDirectory_v2.<lambda>cCrnr])�_offsetror(r(r,r�r�cCrnr])r�ror(r(r,r�
r�cCsd}t|��)Nz"Not allowing setting of legacy api)�	Exception)rkrlr�r(r(r,�
115  legacy_apisz ImageFileDirectory_v2.legacy_apicCs(i|_i|_i|_i|_d|_d|_dSr])�_tags_v1�_tags_v2�_tagdatar��_nextr�ror(r(r,r�s
116  zImageFileDirectory_v2.resetcCstt|��Sr])rt�dictror(r(r,�__str__�zImageFileDirectory_v2.__str__cs�fdd����D�S)z�
117          :returns: dict of name|key: value
118  
119          Returns the complete tag dictionary, with named tags where possible.
120          cs"i|]
\}}t�|�j�j|�qSr()r�lookupr��name)r)�coderlror(r,r-%s��z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)�itemsror(ror,�nameds
121  �zImageFileDirectory_v2.namedcC�tt|j�t|j�B�Sr])rI�setr�r�ror(r(r,�__len__*�zImageFileDirectory_v2.__len__cCsf||jvr|j|}|j|}|j|\}}||||j�||<|j|}|jr1t|ttf�s1|f}|Sr])r�r�r��_load_dispatchr�ri�tuple�bytes)rk�tag�data�typ�size�handlerrXr(r(r,�__getitem__-s
122  
123  
124  
125  z!ImageFileDirectory_v2.__getitem__cC�||jvp	||jvSr])r�r��rkr�r(r(r,�__contains__8�z"ImageFileDirectory_v2.__contains__cCs|�|||j�dSr])�_setitemr�)rkr�rlr(r(r,�__setitem__;r�z!ImageFileDirectory_v2.__setitem__c
126  s�tttf}t�||j��t||�r|gn|}||jvr��jr%�j|j|<n�tj	|j|<t
127  dd�|D��rGt
128  dd�|D��r@tjntj|j|<nkt
129  dd�|D��r�t
130  dd�|D��r`tj
|j|<nRt
131  dd�|D��rptj|j|<nBt
132  dd�|D��r|tjntj|j|<n/t
133  dd�|D��r�tj|j|<nt
134  d	d�|D��r�tj|j|<nt
135  d
136  d�|D��r�tj|j|<|j|tj	kr�dd�|D�}n|j|tjkr�d
d�|D�}|j|tjko�t|t�}|s�t�fdd�|D��}|r�|jn|j}|�sO�jdk�s|j|tjk�s�jdu�rOt|�dk�rO|�sO|�r'|j|tjtjfv�r'|f}z|\||<WdSt�yNt�d|�dt|��d��|d||<YdSw|||<dS)Ncs��|]}t|t�VqdSr])rirV�r)r+r(r(r,rJI��z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>cs��|]}|dkVqdS�rNr(r�r(r(r,rJL��csr�r])ri�intr�r(r(r,rJOr�css(�|]}d|ko
dknVqdS)rrNr(r�r(r(r,rJP��&css(�|]}d|ko
dknVqdS)i���i�Nr(r�r(r(r,rJRr�csr�r�r(r�r(r(r,rJWr�csr�r])rirjr�r(r(r,rJZr�csr�r])rirtr�r(r(r,rJ\r�csr�r])rir�r�r(r(r,rJ^r�cSs&g|]}t|t�r|�dd�n|�qS)�ascii�replace)rirt�encoder�r(r(r,�
137  <listcomp>bs��z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>cSs"g|]
}t|t�r
t|�n|�qSr()rir�rjr�r(r(r,r�gs"c3s�|]}��|�VqdSr])�cvt_enum�r)rl��infor(r,rJkr�rzMetadata Warning, tag z had too many entries: z, expected 1r)rr�rtrr�r�rir��type�	UNDEFINED�all�RATIONAL�SIGNED_RATIONAL�SHORT�SIGNED_SHORT�LONG�SIGNED_LONG�DOUBLE�ASCII�BYTEr�r�r�r��lengthrI�
138  ValueError�warnings�warn)rkr�rlr�Z	basetypes�values�is_ifd�destr(r�r,r�>sr
139  
140  �
141  ��
142  �� ����zImageFileDirectory_v2._setitemcCs.|j�|d�|j�|d�|j�|d�dSr])r��popr�r�r�r(r(r,�__delitem__�sz!ImageFileDirectory_v2.__delitem__cCr�r])�iterr�r�r�ror(r(r,�__iter__�r�zImageFileDirectory_v2.__iter__cCst�|j||�Sr])�struct�unpackr�)rk�fmtr�r(r(r,r��szImageFileDirectory_v2._unpackcGstj|j|g|�R�Sr])r�packr�)rkrr�r(r(r,�_pack�r�zImageFileDirectory_v2._packcs��fdd�}|S)NcsBddlm}|j�d�r|jdd��dd�|�<�|ft�<|S)Nrr�load_r�_� )rrr��
143  startswithr�r�)�funcr��idxr�r(r,�	decorator�s
144  z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr()rr�rr(r
r,�_register_loader�sz&ImageFileDirectory_v2._register_loadercr|)Ncs|t�<|Sr])�_write_dispatch)r�rr(r,r�sz9ImageFileDirectory_v2._register_writer.<locals>.decoratorr()rrr(rr,�_register_writer�sz&ImageFileDirectory_v2._register_writercsXddlm}|\}�}|||<t�d����d��fdd�	ft|<�fdd�t|<dS)	Nrr�=Tcs|�t|������|�Sr])r�rI�rkr�r��rr�r(r,r��sz7ImageFileDirectory_v2._register_basic.<locals>.<lambda>csd���fdd�|D��S)N�c3s�|]	}���|�VqdSr])rr�)rrkr(r,rJ�rKzJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>��join�rkr�)rror,r��s�T)rrr�calcsizer�r)Zidx_fmt_namerrr�r(rr,�_register_basic�s
145  �z%ImageFileDirectory_v2._register_basic�H�shortr0�long�bzsigned byte�hzsigned short�lzsigned longrsrj�d�doubler�Zlong8rTcC�|Sr]r(rr(r(r,�	load_byte��zImageFileDirectory_v2.load_bytecCst|t�r
146  t|f�}|Sr])rir�r��rkr�r(r(r,�
147  write_byte�s
148  
149  z ImageFileDirectory_v2.write_bytercCs"|�d�r|dd�}|�dd�S)N�rTzlatin-1r�)�endswith�decoderr(r(r,�load_string�s
150  z!ImageFileDirectory_v2.load_stringcCs0t|t�r	t|�}t|t�s|�dd�}|dS)Nr�r�r+)rir�rtr�r��rkrlr(r(r,�write_string�s
151  
152  
153  z"ImageFileDirectory_v2.write_stringrr!c�V|�t|�d�d�|�}�fdd��t�fdd�t|ddd�|ddd��D��S)	Nrr0c��r||fSt||�Sr]�rV��ar!�r�r(r,�combine��z4ImageFileDirectory_v2.load_rational.<locals>.combinec3��|]
154  \}}�||�VqdSr]r(�r)�num�denom�r7r(r,rJ���z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>rr�r�rIr��zip�rkr�r��valsr(�r7r�r,�
load_rational��0z#ImageFileDirectory_v2.load_rationalc�d��fdd�|D��S)Nrc3s(�|]}�jdgt|d��R�VqdS)Z2Ll��N)rr\�r)rcror(r,rJ�s�
155  �z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>rrr(ror,�write_rational�s�z$ImageFileDirectory_v2.write_rationalrcCr&r]r(rr(r(r,�load_undefined�r(z$ImageFileDirectory_v2.load_undefinedcCr&r]r(r/r(r(r,�write_undefined�r(z%ImageFileDirectory_v2.write_undefined�
156  cr1)	Nrr#cr2r]r3r4r6r(r,r7r8z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec3r9r]r(r:r=r(r,rJr>z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>rrr?rAr(rCr,�load_signed_rational�rEz*ImageFileDirectory_v2.load_signed_rationalcrF)Nrc3s*�|]}�jdgt|dd��R�VqdS)Z2li���i�N)rrdrGror(r,rJ
157  s
158  ��
159  �z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>rrr(ror,�write_signed_rationals�z+ImageFileDirectory_v2.write_signed_rationalcCs8|�|�}t|�|krd|�dt|��d�}t|��|S)Nz&Corrupt EXIF data.  Expecting to read � bytes but only got z. )�readrI�OSError)rk�fpr��retr�r(r(r,�_ensure_reads
160  ���z"ImageFileDirectory_v2._ensure_readc
161  Csr|��|��|_�z|jr|�d|�|d��n	|�d|�|d��d}t|�D]�}|jr7|�d|�|d��n	|�d|�|d	��\}}}}t�||j	�j
162  }t�|d
163  �}	d|�d|�d
|	�d|�d�	}
164  z	|j
|\}}Wnty~t�|
165  d|���Yq(w||}
|
|jr�dndkr�|��}|�|jr�dnd|�\}|
166  d|�d|��7}
167  |�|�t�||
�}|�|�n|d|
�}t|�|
kr�t�d|
�dt|��d|���t�|
168  �q(|s�t�|
169  �q(||j|<||j|<|
170  d|
dkr�d|
nt|�7}
171  t�|
172  �q(|j�r|�d|�|d��n	|�d|�|d��\|_WdSt�y8}
173  zt�t|
174  ��WYd}
175  ~
176  dSd}
177  ~
178  ww)Nr�r!rrrZHHQ8s��HHL4sr1�unknownztag: � (�
179  ) - type: �)z - unsupported type rr0z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read rNz. Skipping tag �
180   - value: r8�<table: %d bytes>)r��tellr�r�r�rS�rangerr�r�r�r�getr��KeyError�logger�debug�seekr�
181  _safe_readrIr�r�r�r�r�r�rPrt)rkrQZ	tag_count�ir�r��countr��tagname�typnamer��	unit_sizer�r��here�offsetr(r(r,�loadsz
182  ���
183  ��
184  ����
185  
186  
187  
188  �����zImageFileDirectory_v2.loadrc
Cs|�dt|j��}g}|t|�t|j�dd}d}t|j���D]�\}}|tkr/t|�}|j�|�}t�	d|�d|�dt
189  |����|tjkoNt
|t�}|ry|jdkrYd}	nd	}	t|	|d
190  �}
191  |j|}|��D]\}}
|
|
192  |<qj|
193  �|�}nt
|t�r�|n|f}|j||g|�R�}t�||j�j}|r�dnt�|d�}d
|�d|�d|�d|�d�	}|dt|�dkr�dt|�nt|�7}t�	|�|r�d}n|tjtjtjfvr�t|�}nt|�}t|�dkr�|�||||�dd�df�q#|�||||�d|�|f�|t|�ddd7}q#|du�r>||\}}}}}|�r'd}t|��|�d|�d|�d|�}|||||f||<|D]*\}}}}}t�	|�d|�d|�dt
194  |��dt
195  |���	�||�d||||�7}�q@|d7}|D]\}}}}}||7}t|�d@�r�|d7}�qq|S)Nrr1rzTag z, Type: z	, Value: r�sII*sMM*)r��ifdrVzsave: rWrXrYrZr3r[rr+rr0rz&multistrip support not yet implementedrr
196  rUs) rrIr��sortedr��STRIPOFFSETSr�r^r`rar�rr�rir�r�r��tobytesr�rr�r�r�rrtr�r�r��append�ljust�NotImplementedErrorr�)rkrj�result�entriesZstripoffsetsr�rlr�r�r�rlr��ifd_tagZ	ifd_valuer�rfrgr�rer(r(r,ro]sl 
197  
198  
199  �
200  
201  
202  .�zImageFileDirectory_v2.tobytescCsN|��dkr|�|j|�ddd��|��}|�|�}|�|�|t|�S)NrZHL�*r!)r\�writer�rrorI)rkrQrjrsr(r(r,�save�s
203  
204  zImageFileDirectory_v2.save)r�NNrrA)3r�r�r�r�rmr�rQrjr��setterr�r�r�r�r�r�r�r�rrr�rrrr�list�maprr�r��SIGNED_BYTEr�r��FLOATr��IFD�LONG8r'r*r.r0rDrHrIrJrLrMrSrkrorxr(r(r(r,r��s|
205  < 
206  P
207  
208  
209  
210  
211  
212  
213  
214  
215  ���
216  
217  
218  
219  
220  
221  
222  DMr�r
223  r	r�write_cs�eZdZUdZ�fdd�Zedd��Zedd��Zee	d<	e
224  dd	��Zd
225  d�Zdd
�Z
dd�Zdd�Zdd�Zdd�Z�ZS)�ImageFileDirectory_v1a�This class represents the **legacy** interface to a TIFF tag directory.
226  
227      Exposes a dictionary interface of the tags in the directory::
228  
229          ifd = ImageFileDirectory_v1()
230          ifd[key] = 'Some Data'
231          ifd.tagtype[key] = TiffTags.ASCII
232          print(ifd[key])
233          ('Some Data',)
234  
235      Also contains a dictionary of tag types as read from the tiff image file,
236      :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`.
237  
238      Values are returned as a tuple.
239  
240      ..  deprecated:: 3.0.0
241      cst�j|i|��d|_dS)NT)�superrmr�)rkr~�kwargs��	__class__r(r,rm�s
242  zImageFileDirectory_v1.__init__cCrnr])r�ror(r(r,r��r�zImageFileDirectory_v1.<lambda>cCrnr])r�ror(r(r,r��r�r�cCs(||jd�}|j|_|j|_|j|_|S)a2Returns an
243          :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
244          instance with the same data as is contained in the original
245          :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
246          instance.
247  
248          :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
249  
250          rP)rQr�r�r�)�cls�originalrlr(r(r,�from_v2�s
251  zImageFileDirectory_v1.from_v2cCs4t|jd�}t|j�|_t|j�|_t|j�|_|S)a2Returns an
252          :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
253          instance with the same data as is contained in the original
254          :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
255          instance.
256  
257          :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
258  
259          rP)r�rQr�r�r�r�)rkrlr(r(r,�to_v2�s
260  zImageFileDirectory_v1.to_v2cCr�r])r�r�r�r(r(r,r�r�z"ImageFileDirectory_v1.__contains__cCr�r])rIr�r�r�ror(r(r,r�r�zImageFileDirectory_v1.__len__cCr�r])rr�r�r�ror(r(r,rr�zImageFileDirectory_v1.__iter__cCsdD]	}|�|||�qdS�N)FT)r�)rkr�rlr�r(r(r,r�
261  s�z!ImageFileDirectory_v1.__setitem__cCsn||jvr&|j|}|j|}|j|\}}dD]
}|�|||||�|�q|j|}t|ttf�s5|f}|Sr�)r�r�r�r�r�rir�r�)rkr�r�r�r�r��legacyrXr(r(r,r�s
262  
263  
264  
265  z!ImageFileDirectory_v1.__getitem__)r�r�r�r�rmr��tags�tagdatar��__annotations__�classmethodr�r�r�r�rr�r��
__classcell__r(r(r�r,r��s
266  
267  r�cs�eZdZdZdZdZd�fdd�	Zdd�Zed	d
268  ��Z	dd�Z
269  d
d�Zdd�Zdd�Z
dd�Z�fdd�Zdd�Zdd�Zdd�Z�ZS)�
TiffImageFile�TIFFz
270  Adobe TIFFFNcs"d|_	d|_	t��||�dSr])�tag_v2r�r�rm)rkrQ�filenamer�r(r,rm)s
271  zTiffImageFile.__init__cCs�|j�d�}|ddkr||j�d�7}t|�|_d|_|jj|_|_d|_|j|_	g|_
272  d|_t�
d�t�
d|j���t�
dt|����|�d	�dS)
273  z#Open the first image in a TIFF filer!rr�NrTz*** TiffImageFile._open ***z- __first: z- ifh: r)rQrOr�r�rlr�Z_TiffImageFile__first�_TiffImageFile__next�_TiffImageFile__frame�_fp�
274  _frame_pos�	_n_framesr`rar��_seek)rkr�r(r(r,�_open2s
275  
276  zTiffImageFile._opencCsX|jdur)|��}|�t|j��|jdur$|�|��d�|jdus|�|�|jS)Nr)r�r\r�rIr�rb)rk�currentr(r(r,�n_framesMs
277  
278  
279280  zTiffImageFile.n_framescCs<|�|�sdS|�|�t�|j�tj�|j|j�|_dS)z%Select a given frame as current imageN)	�_seek_checkr�r�_decompression_bomb_checkr��core�new�mode�im)rk�framer(r(r,rbWs
281  
282  
283  zTiffImageFile.seekcCsT|j|_|j��t|j�|kr�|jsd}t|��t�d|�d|j	�d|j�d|j�����|j�
284  |j�|j�|j�t�d|j���|j�
|j�|jj|jvrYd|_n|jj|_|jdkrh|d|_t|j�dkru|jdk|_|j	d7_	t|j�|ks|j�
285  |j|�|j�
|j�|��t�|j�|_|_||_	|��dS)	Nzno more images in TIFF filezSeeking to frame z, on frame z	, __next z, location: zLoading tags, location: %srr)r�rQr\rIr�r��EOFErrorr`rar�rbrpr�rkr�r��is_animated�_reload_exifr�r�r�rl�_setup)rkr�r�r(r(r,r�bs@
286  ���
287  
288  
289  �zTiffImageFile._seekcCrn)zReturn the current frame number)r�ror(r(r,r\�rpzTiffImageFile.tellcCst|jvr
|�|jt�SiS)z�
290          Returns a dictionary containing the XMP tags.
291          Requires defusedxml to be installed.
292  
293          :returns: XMP tags in a dictionary.
294          )�XMPr��_getxmpror(r(r,�getxmp�szTiffImageFile.getxmpcCs�i}|j�d�}|r^|dd�dkr^t|dd��}t�|ddd�d}t|d|d|��}|d|d||�}d	|i||<|t�d||d�dd�}|dd�dks|S)
295  a5
296          Returns a dictionary of Photoshop "Image Resource Blocks".
297          The keys are the image resource ID. For more information, see
298          https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727
299  
300          :returns: Photoshop "Image Resource Blocks" in a dictionary.
301          rNrs8BIMrrrrKr�)r�r^�i16�math�ceil�i32)rk�blocksrX�id�nr�r�r(r(r,�get_photoshop_blocks�s"�z"TiffImageFile.get_photoshop_blockscs|jr
302  |jr
303  |��St���Sr])�tile�use_load_libtiff�
_load_libtiffr�rkror�r(r,rk�s
304  zTiffImageFile.loadcCs�|jr/tjjtjjtjjtjjtjjtjjtjj	d��
305  |j�}|dur/|j�|�|_|jj
|_|jsPd|_|j��|��}tj��D]}||vrJqC|�|�qCdSdS)N)rrrrrrr!T)�_tile_orientationr�	Transpose�FLIP_LEFT_RIGHT�
306  ROTATE_180�FLIP_TOP_BOTTOM�	TRANSPOSE�
307  ROTATE_270�
308  TRANSVERSE�	ROTATE_90r^r��	transposer��_sizer��!_close_exclusive_fp_after_loadingrQr\�getexifr�TAGS_V2_GROUPS�keys�get_ifd)rk�method�exif�keyr(r(r,�load_end�s0��	
309  
310  �	zTiffImageFile.load_endc
311  
312  Cs�tj�|�|��t|j�dksd}t|��|jdd}t|jdd�}zt|jd�o5t	�
313  |j���}t|jd�rA|j��WntyMd}Ynw|rT||d<t�
|jd	t|�|j�}z	|�|j|�Wnty|}zd
314  }t|�|�d}~ww|jo�|j}t|jd�r�t�d
�|�|j���\}}	n,|r�t�d�|s�|j�d�|�d�\}}	nt�d�|j�d�|�|j���\}}	|r�zt	�|�Wn	ty�Ynwg|_d|_|��|r�|j��d|_|	dkr�t|	��tj�|�S)zWOverload method triggered when we detect a compressed tiff
315          Calls out to libtiffrzNot exactly one tilerr�fileno�flushFr�libtiffzCouldn't set the imageN�getvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.sfpfpz+don't have fileno or getvalue. just reading)rrk�load_preparerIr�rPrz�hasattrrQ�os�dupr�r��_getdecoderr�r��
decoderconfig�setimager�r��
_exclusive_fpr�r`rar-r�rbrO�close�readonlyr�)
316  rkr��extentsr~rQ�decoder�eZ
close_self_fpr��errr(r(r,r��sl
317  ���
318  ��
319  
320  
321  
322  �
323  zTiffImageFile._load_libtiffc
324  Csd|jvrd}t|��t|j�td�|_|j�td�|_|j�td�}|jdkr+d}|j�t	d�}t
325  �d�t
326  �d|j���t
327  �d	|���t
328  �d
329  |j���t
330  �d|���t
331  �d|j�t
����t|j�t��}t|j�t��}||f|_t
332  �d
|j���|j�td�}t|�dkr�t|�t|�kr�dkr�nnd}|j�td�}|j�td�}|dvr�d}	n	|dkr�d}	nd}	|	t|�7}	t|�}
333  |j�t|jdkr�|dvr�dnd�}|tkr�t
334  �d|�d}t|��||
335  kr�|d|�}n||
336  k�r|
337  dk�r||}t|�|k�rd}t|��|jj|||||f}t
338  �d|���z	t|\|_}
Wnt �yF}zt
339  �d�d}t|�|�d}~wwt
340  �d|
���t
341  �d|j���|j|j!d<|j�t"d�}|j�t#d�}|�r�|�r�|j�t$�}|dk�r�||f|j!d <n,|dk�r�|d!|d!f|j!d <n|du�r�||f|j!d <||f|j!d"<n||f|j!d"<d}}}g|_%t&�p�|jd#k|_'|j'�r1|dk�r�|dd�d|dd�}t
342  �d|���t|\|_}
|
d$k�r�d%}
d&|
v�r�|
�(d&d'�}
d(|
v�r|
�(d(d'�}
|dk�r|jd)k�r|jdk�rd*}
|
|jd+|jj)f}|j%�*d,dd||fd|f�n�t+|jv�s=t,|jv�r�t+|jv�rU|jt+}|j�t-|�}|jd}n|jt,}|j�t.�}|j�t/�}|D]h}|||k�rz|t0|�d-}nd}|
}|jdk�r�|
|}||	}|t|�df}|j%�*|j||t|||�t|||�f||f�||}||jdk�r�d||}}||jdk�r�d}}|d7}�qhnt
343  �d.�d}t|��t1|jv�r�|jt1|j!d/<|jd0v�rd1d2�|jt2D�}t3�4d3d4�5|��|_6|j�d5�|_7dS)6z-Setup this image object based on current tagsi�z+Windows Media Photo files not yet supportedrrrrz*** Summary ***z- compression: z- photometric_interpretation: z- planar_configuration: z- fill_order: z- YCbCr subsampling: z- size: r.r()rrr!rrr)rrz.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelNzunknown data organizationzformat key: z- unsupported formatzunknown pixel modez- raw mode: z- pil mode: �compressionr�dpigR���Q@�
344  resolutionrr2�I;16Nz;16Bz;16Nz;16Lr r?Fr�r!z- unsupported data organization�icc_profile�rErFcSsg|]}t|d��qS�rr)r)r!r(r(r,r�sz(TiffImageFile._setup.<locals>.<listcomp>�RGB;Lri)8r�rP�COMPRESSION_INFOr^�COMPRESSION�_compression�PLANAR_CONFIGURATIONZ_planar_configuration�PHOTOMETRIC_INTERPRETATION�	FILLORDERr`rar��YCBCRSUBSAMPLINGr��
345  IMAGEWIDTH�IMAGELENGTHr�r��SAMPLEFORMATrIrar`�
BITSPERSAMPLE�EXTRASAMPLES�SAMPLESPERPIXEL�MAX_SAMPLESPERPIXEL�errorr�rQ�	OPEN_INFOr�r_r��X_RESOLUTION�Y_RESOLUTION�RESOLUTION_UNITr��READ_LIBTIFFr�r�rjrprn�TILEOFFSETS�ROWSPERSTRIP�	TILEWIDTH�
346  TILELENGTH�sum�
347  ICCPROFILE�COLORMAPr
348  rr�paletter�)rkr��photoZ	fillorder�xsize�ysizeZ
sample_formatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamples_per_pixelr��rawmoder��xres�yresZresunit�x�y�layerr5�offsetsr"�wrj�strideZtile_rawmoderr(r(r,r�+s
349  
350  
351  
352  ,���
353  
354  ��
355  
356  
357  
358  

359  
360  
361  
362  
363  
364  ����
365  zTiffImageFile._setup)NN)r�r�r��format�format_descriptionr�rmr�r�r�rbr�r\r�r�rkr�r�r�r�r(r(r�r,r�#s"	
366  	&	]r�r/r0r>rErFr5r<r2r6r9r:r?rBr@rG�YCbCrrHr=r4r7r;)r7r;c3Cs�z
t|j\}}}}}}Wnty%}	zd|j�d�}
367  t|
368  �|	�d}	~	wwt|d�}|j}|j}
z|d}WntyM|j�d�}t	|t
369  �rKd}Ynw|durUd}n
|dkr\d}n|dkrbd	}tpg|dk}d
370  |t<|j
d|t<|j
d
371  |t<d|vr�|d}nd
|vr�|d
}t	|t�r�t��}|�|�|}ni}t�dt|��t	|t�r�|��}|D]1}t	|tj�r�|tj��vr�|�|�||<n|�|�||<z
372  |j||j|<Wq�ty�Yq�wt|d��rt t!t"t#t$t%fD]}||j&v�r
373  |j&|||<|j&j||j|<q�|�d|j�d��}|�r||t'<t(dft!dft"dft!dft"dft dft)dft*dft+dft,dff
374  D]\}}||v�rK||||<�q<|�d�}|�red|t <|d|t!<|d
375  |t"<|dk�r{||t-<t.|�d
376  k�r{t.|�|t/<|du�r�||t0<|d
377  k�r�||t1<t2|v�r�||t2<nF|jdv�r�|t2dk�r�|jdk�r�|�3�}|��}t4|j5�D]}t4|j6�D]}|||fdk�r�dnd|||f<�q��q�|}nt7�8|�}|jd v�r|j9�:d!d"�}g}t.|�d#}t4d#�D]}|d$d%�|||||d
378  �D�7}|dgd&|7}�q�||t;<t.|�|j
d|dd'd(}|�rY|�d)t<�}|dk�r;d
379  n	t=|||j
d
380  �} |dk�rXt=| d'd(d(|j
d
381  �} n|j
d
382  } | dk�red
383  } |dk�rld
384  n|| }!|j
d
385  | d
386  | }"| |t><|!d*k�r�tj?|jt@<|!f|"d
387  ||j
d
388  |!|"d
389  f|t@<tAt4d|!|"|!��|tB<tC�|d
390  �|tD<|jd+k�r�tEd,tFd-i�G�D]\}#}$|�H|#|$��q�tItJtKtLg}%|�rOd.|v�r|d.}&t	|&t
391  ��r�|&dk�s�|&d/k�r�d0}
392  tM|
393  ��|dk�rd1}
394  tM|
395  ��|&|tN<t�d2�t�d3tO|�G���d}'t|d4��r8z|�Pd�tQ�R|�S��}'WntTjU�y7Ynwi}(|%tFt@tBtVtWg7}%t-|di})i}*t|d5��rV|jX��}*itY|di��|*�}+t1|+v�rh|+t1=tZ�[|�G�|+�G��D]g\}#}$|#tj\v�r�tj]j^�s��qr|#|jv�r�|j|#|(|#<nt	|$t
396  t_t`tf��s��qrt�a|#�jb},|,�r�|,|(|#<|#|)v�r�|#|%v�r�t	|$t`��r�|$�cd6d7�d8|)|#<�qrt	|$td��r�t_|$�|)|#<�qr|$|)|#<�qrt1|)v�r�t.|)t1�d
397  k�r�|)t1d|)t1<t�d9tO|)�G���|jd:v�rd;}t|)�G��}-|-�e�|||'||-|(f}.t�f|jd<|.|
�}	|	�g|j9d=|j
�	|	�cd?�\}/}0}1|'�s9|�h|1�|0�r=n�q)|0dk�rNd@|0�dA�}
398  t|
399  ��n |%D]}#||#=�qQ|�i|�}2tj�k||dd=|j
|2||d
400  ffg�dB|v�ry||_ldSdS)CNzcannot write mode z as TIFFrPr�rrr r$r"rrZtiffinfor�zTiffinfo Keys: %sr�r��descriptionr��x_resolutionZy_resolution�resolution_unitZsoftware�	date_timeZartist�	copyrightr�rr.)r/r0r/��r�r?r�rcSsg|]}|d�qSr�r(r�r(r(r,r��sz_save.<locals>.<listcomp>rrr!�
401  strip_sizerr)rr)rr�rrr�quality�dzInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr�r�r�r�r+zConverted items: %s)r4r2r�r�rCTi@zencoder error z when writing image file�_debug_multipage)m�	SAVE_INFOr�r_rPr��encoderinfo�
encoderconfigr�r^rir��
WRITE_LIBTIFFr�r�r�r�r�r�Exifrkr`rarzr�r�rr�r�r�r�r�r�r�r�r��IPTC_NAA_CHUNK�PHOTOSHOP_CHUNKr�r�r��IMAGEDESCRIPTION�SOFTWARE�	DATE_TIME�ARTIST�	COPYRIGHTr�rIr�r�r�r��copyr]�height�widthr	�invertr��
402  getpaletter��
403  STRIP_SIZEr`r�r��STRIPBYTECOUNTSr�rn�COMPRESSION_INFO_REVr�r��REFERENCEBLACKWHITEr��
404  setdefaultr�r�r��TILEBYTECOUNTSr��JPEGQUALITYrmrbr�r�r��io�UnsupportedOperation�TRANSFERFUNCTION�SUBIFDr�r}�	itertools�chain�LIBTIFF_COREr�Zlibtiff_support_custom_tagsrjrtr�r�r�rV�sort�_getencoderr�rwrxr�_saver)3r�rQr�rrQrr
�bits�extrar�r�rlrrr�r�r�r�r��iccr�r�Zinverted_im�pxrr�lut�colormap�colorsrdrZ
im_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imager�rlZ	blocklistrr��typesZattsZ
405  legacy_ifdZ
supplied_tagsr�r�r5r#�sr$rjr(r(r,r<.s�
406  ��
407  
408  ��
409  
410  
411  �
412  ����
413  �
414  
415  
416  
417  
418  
419  &�
420  &""
421  �
422  
423  
424  
425  ���
426  �
427   
428  
429  
430  ��	
431  
432  
433  �
434  �
435  �
436  
437  �
438  
439  �r<c@s�eZdZgd�Zhd�Zd1dd�Zdd�Zdd	�Zd
440  d�Zdd
�Z	dd�Z
441  dd�Zej
fdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd2d.d/�Zd0S)3�AppendingTiffWriter)
rrrrrr!rrrrr!rr!>i riii	rFcCstt|d�r||_d|_n"||_d|_zt||rdnd�|_Wnty-t|d�|_Ynw|j��|_|��dS)NrOFTzw+bzr+b)	r�rs�close_fpr��openrPr\�	beginning�setup)rk�fnr�r(r(r,rmis
442  �zAppendingTiffWriter.__init__cCs�|j�|jtj�d|_d|_|j�d�|_}|sd|_	dSd|_	|dkr,|�
443  d�n|dkr6|�
444  d�nd	}t|��|��|�
�dS)
445  NrrTFrMr�rLr�zInvalid TIFF file header)rsrbrIr��SEEK_SET�whereToWriteNewIFDOffset�offsetOfNewPagerO�IIMM�isFirst�	setEndian�RuntimeError�skipIFDs�goToEnd)rk�iimmr�r(r(r,rJws zAppendingTiffWriter.setupcCs�|jrdS|j�|j�|j�d�}|sdS||jkr!d}t|��|��}||j7}|j�|j�|�	|�|j�|�|�
446  �dS)Nrz1IIMM of new page doesn't match IIMM of first page)rPrsrbrNrOrOrR�readLongrM�	writeLong�fixIFD)rkrUr��
447  ifd_offsetr(r(r,�finalize�s
448  
449  
450  zAppendingTiffWriter.finalizecCs|��|��dSr])rZrJror(r(r,�newFrame�szAppendingTiffWriter.newFramecCs|Sr]r(ror(r(r,�	__enter__�szAppendingTiffWriter.__enter__cCs|jr|��dS)NF)rGr�)rk�exc_type�	exc_value�	tracebackr(r(r,�__exit__�szAppendingTiffWriter.__exit__cCs|j��|jSr])rsr\rNror(r(r,r\�rSzAppendingTiffWriter.tellcCs*|tjkr
451  ||j7}|j�||�|��Sr])r�rLrNrsrbr\)rkrj�whencer(r(r,rb�s
452  
453  zAppendingTiffWriter.seekcCs^|j�dtj�|j��}d|d}d|krdkr'nn|j�t|��|j��|_dS)Nrr3)rsrbr��SEEK_ENDr\rwr�rN)rk�posZ	pad_bytesr(r(r,rT�s
454  zAppendingTiffWriter.goToEndcCs.||_|jd|_|jd|_|jd|_dS)Nr0rZHHL)�endian�longFmt�shortFmt�	tagFormat)rkrdr(r(r,rQ�szAppendingTiffWriter.setEndiancCsP	|��}|dkr|j��d|_dS|j�|�|��}|j�|dtj�q)NTrrr1)rVrsr\rMrb�	readShortr��SEEK_CUR)rkrY�num_tagsr(r(r,rS�s�zAppendingTiffWriter.skipIFDscCs|j�|�Sr])rsrwr)r(r(r,rw�r�zAppendingTiffWriter.writecC�t�|j|j�d��\}|S)Nr)rrrfrsrOr/r(r(r,rh��zAppendingTiffWriter.readShortcCrkrN)rrrersrOr/r(r(r,rV�rlzAppendingTiffWriter.readLongcC�R|j�dtj�|j�t�|j|��}|dur%|dkr'd|�d�}t|��dSdS)N�����r�wrote only � bytes but wanted 4�	rsrbr�rirwrrrerR�rkrlZ
bytes_writtenr�r(r(r,�rewriteLastShortToLong���z*AppendingTiffWriter.rewriteLastShortToLongcCrm)Nrnrro� bytes but wanted 2)	rsrbr�rirwrrrfrRrrr(r(r,�rewriteLastShort�rtz$AppendingTiffWriter.rewriteLastShortcCrm)N�����rrorprqrrr(r(r,�rewriteLastLong�rtz#AppendingTiffWriter.rewriteLastLongcC�B|j�t�|j|��}|dur|dkrd|�d�}t|��dSdS)Nrroru)rsrwrrrfrRrrr(r(r,�
455  writeShort��
456  �zAppendingTiffWriter.writeShortcCry)Nrrorp)rsrwrrrerRrrr(r(r,rWr{zAppendingTiffWriter.writeLongcCs|��|j��dSr])rZrsr�ror(r(r,r�szAppendingTiffWriter.closecCs|��}t|�D]u}t�|j|j�d��\}}}|j|}||}|dk}|s5|��}	|	|j	7}	|�
457  |	�||jvrs|j��}
458  |rV|j
||dk|dkd�|j�|
459  d�n|j�|	�|j
||dk|dkd�|j�|
460  �d}	}
461  q|r}|j�dtj�qdS)Nr!rr)�isShort�isLong)rhr]rrrgrsrO�
462  fieldSizesrVrNrx�Tagsr\�
463  fixOffsetsrbr�ri)rkrjrdr�Z
464  field_typere�
465  field_size�
466  total_size�is_localrjZcur_posr(r(r,rXs6
467  
468  
469  
470  
471  ��
472  ��zAppendingTiffWriter.fixIFDcCs�|s
473  |s
474  d}t|��t|�D]J}|r|��n|��}||j7}|rK|dkrK|dkr/d}t|��|�|�|j�dtj	�|�
475  tj�|j�dtj	�q|rS|�
|�q|�|�qdS)Nz offset is neither short nor longrrznot implementedi����r!)rRr]rhrVrNrsrsrbr�rirzrr�rvrx)rkrer|r}r�rdrjr(r(r,r�.s$
476  
477  �zAppendingTiffWriter.fixOffsetsN)F)FF)r�r�r�r~rrmrJrZr[r\r`r\r3rLrbrTrQrSrwrhrVrsrvrxrzrWr�rXr�r(r(r(r,rFPs2
478  
479  #rFc	Cs�|j��}|j}t|�dg��}t|d�s|st|||�S|��}zWt|��;}|g|D]-}||_||_t|d�s<d}	n|j	}	t
480  |	�D]}
481  |�|
482  �|��t|||�|�
�qCq,Wd�n1sdwYW|�|�dSW|�|�dS|�|�w)N�
append_imagesr�r)rr'rrzr^r�r<r\rFr�r]rbrkr[)r�rQr�rrr��cur_idx�tf�ims�nfrrr(r(r,�	_save_allHs2
483  
484  
485  
486  
487  ����r�z.tifz.tiffz
488  image/tiff)lr3r7�loggingr�r�rr��collections.abcr�	fractionsr�numbersrr�rrr	r
489  r�_binaryrr�r
r�rr�	getLoggerr�r`r�r�IFD_LEGACY_APIr,r�r�r�r�r�r�r�r�r"rnr�r�r-r�r�r�r�r5r#r$r%�	PREDICTORr�r�r�r�r1r6r�r��
490  JPEGTABLESr�r/r&r r!r��EXIFIFDr�r2�IMAGEJ_META_DATA_BYTE_COUNTS�IMAGEJ_META_DATAr�r�r.r�rar�r�rOrRr\rdr�rrVr�rr�r��setattrr��ImageFileDirectoryr�rr<rFr��
register_openr
�
register_save�register_save_all�register_extensions�
register_mimer(r(r(r,�<module>s(
491  �������	�
492  ���
������������	�
493  ���
������������������� �!�"�#�$�%�&�'�(�)�*�+�,�-�.�/�0�1�2�3�4�5�6�7�8�9�:�;�<�=�>�?�@�A�B�C�D�E�F�G�H�I�J�K�L�M�N�O�P�Q�R�S�T�U�V�W�X�Y�Z�[�\�]�^�_�`�a�b�c�d�e�f�g�h�i�x
494  \u������	�
495  ���
��������$y