B ] @s ddlmZmZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZmZddlmZmZmZmZddlmZmZddlmZdd lmZydd lmZWn ek rdd lmZYnXd Zd Z d Z!d Z"d Z#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5d Z6d!Z7d"Z8d#Z9d$Z:d%Z;d&Zd)Z?d*Z@d+ZAd,ZBd-ZCd.ZDd/ZEd0ZFd1ZGd2ZHd3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDZIdEdFeIJDZKe$ddGddGdHfdIe%ddGddGdHfdIe$ddGdJdGdHfdKe%ddGdJdGdHfdKe$ddGddGdHfdLe%ddGddGdHfdLe$ddGdJdGdHfdMe%ddGdJdGdHfdMe$ddGddNdHfdOe%ddGddNdHfdOe$ddGdJdNdHfdPe%ddGdJdNdHfdPe$ddGddNdHfdQe%ddGddNdHfdQe$ddGdJdNdHfdRe%ddGdJdNdHfdRe$ddGddSdHfdTe%ddGddSdHfdTe$ddGdJdSdHfdUe%ddGdJdSdHfdUe$ddGddSdHfdVe%ddGddSdHfdVe$ddGdJdSdHfdWe%ddGdJdSdHfdWe$ddGddXdHfdYe%ddGddXdHfdYe$ddGdJdXdHfdZe%ddGdJdXdHfdZe$ddGddXdHfd[e%ddGddXdHfd[e$ddGdJdXdHfd\e%ddGdJdXdHfd\e$ddGdd]dHfd^e$ddGdd_dHfd`e%ddGdd_dHfdae$ddNdd_dHfdbe%ddNdd_dHfdce$dddddedHfdfe%dddddedHfdge$ddGddedHfdhe$ddNddedHfdie%ddNddedHfdje$dddddedHfdfe%dddddedHfdge$ddGddkdNfdle%ddGddkdNfdle$dJdGddmdHfdne%dJdGddmdHfdne$dJdGdJdmdHfdoe%dJdGdJdmdHfdoe$dJdGddpdHfdqe%dJdGddpdHfdqe$dJdGddpdrfdse%dJdGddpdrfdse$dJdGddtdufdve%dJdGddtdufdve$dJdGddwdxfdye%dJdGddwdxfdye$dJdGddpdGfdze%dJdGddpdGfdze$dJdGddtd{fd|e%dJdGddtd{fd|e$dJdGddwd}fd~e%dJdGddwd}fd~e$dJdGddpdNfdqe%dJdGddpdNfdqe$dJdGddtdfde%dJdGddtdfde$dJdGddwdfde%dJdGddwdfde$dJdGddpdfdqe%dJdGddpdfdqe$dJdGdddHfde%dJdGdddHfde$dJdGdddHfde%dJdGdddHfde$dJdGdddrfde%dJdGdddrfde$dJdGdddGfde%dJdGdddGfde$dJdGdddNfde%dJdGdddNfde$ddGddGdHfde%ddGddGdHfde$ddGdJdGdHfde%ddGdJdGdHfde$ddGddNdHfde%ddGddNdHfde$ddGdJdNdHfde%ddGdJdNdHfde$ddGddSdHfde%ddGddSdHfde$ddGdJdSdHfde%ddGdJdSdHfde$ddGddXdHfde%ddGddXdHfde$ddGddkdNfde%ddGddkdNfde$ddGdJdXdHfde%ddGdJdXdHfde$ddGddpdHfde%ddGddpdHfde$ddGddtdrfde%ddGddtdrfde$ddGddwdufde%ddGddwdufde$ddGdddHfde$ddGddmdHfde%ddGddmdHfde$ddGddmdHfde%ddGddmdHfdioZLddddgZMddZNddZOddZPiZQiZRGdddeZSGdddeZTeQeT_QeReT_RxNeJD]B\ZUZVeVWddZVeXeTdeVeQeUdeXeTdeVeReU qW[Q[R[U[VGdddeTZYeYZZGdddejZ[de$dddGdfde$dddXdfde$dddkdJfde$dddXdfde$dddkdJfde$ddJdedfde$ddd_dfde$ddJd_dfde$dddedfde$dJddmdfde$dJddpdfde$dJddpdJfde$dddpdfde$dddmdfde$dddmdfde%ddJdedfde%ddd_dfde%ddJd_dfde%dddedfdʜZ\dd̄Z]Gdd΄d΃Z^ddЄZ_e`e[jae[eNebe[jae]ece[jae_ede[jaddgeee[jadӡdS))divisionprint_functionN)Fraction)NumberRational)Image ImageFile ImagePaletteTiffTags)i8o8)py3)TYPES)MutableMappingz1.3.5FTsIIsMMiiiii iiiiiiiii(i-i1i2i;i=i@iDiRiSi[iiiiIisiiiiiirawZ tiff_ccittZgroup3Zgroup4Ztiff_lzw tiff_jpegjpegZtiff_adobe_deflateZ tiff_raw_16ZpackbitsZtiff_thunderscanZ tiff_deflateZ tiff_sgilogZ tiff_sgilog24lzmaZzstdZwebp)riii)iitiuimiPiQcCsi|]\}}||qSr).0kvrr5/tmp/pip-build-ktz6qwqq/Pillow/PIL/TiffImagePlugin.py sr")rr)1z1;Ir)r#z1;IR)r#r#)r#z1;R)r)LzL;2I)r$zL;2IR)r$zL;2)r$zL;2R)r)r$zL;4I)r$zL;4IR)r$zL;4)r$zL;4R)r)r$zL;I)r$zL;IR)r$r$)r$zL;R) )zI;16zI;12))zI;16zI;16)zI;16BzI;16B)IzI;16S)r'zI;16BS)r) )FzF;32F)r)zF;32BF)r'zI;32N)r'zI;32S)r'zI;32BS)rr)LAr*)rrr)RGBr+)r+zRGB;R)rrrr)RGBAr,)r)RGBXr-)rrrrr)rr)r-ZRGBXX)rrrrrr)rrr)r-ZRGBXXX)r,ZRGBa)rr)r,ZRGBaX)rrr)r,ZRGBaXX)rr)r,ZRGBAX)rrr)r,ZRGBAXX)i)r&r&r&)r+zRGB;16L)r+zRGB;16B)r&r&r&r&)r,zRGBA;16L)r,zRGBA;16B)r-zRGBX;16L)r-zRGBX;16B)r,zRGBa;16L)r,zRGBa;16Br)PzP;1)r.zP;1R)r.zP;2)r.zP;2R)r.zP;4)r.zP;4R)r.r.)PAr/)r.zP;Rr)CMYKr0)r0ZCMYKX)r0ZCMYKXX)r0zCMYK;16Lr)r+r-r)LABr1sMM*sII*sMM*sII*cCs|ddtkS)Nr)PREFIXES)prefixrrr!_acceptsr4cCs<t|dk}t|rd|n||}|r8|dddS|S)Nr)abs IFDRationallimit_rational)valZmax_valinvZn_drrr!_limit_rationals r;cCstjjddddS)N rzVersion r)rcoreZlibtiff_versionsplitrrrr!_libtiff_versionsr?c@s>eZdZdZdZd1ddZeddZedd Zd d Z d d Z ddZ ddZ ddZ e dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe d Ze d!Ze d"Ze d#Ze d$Ze d%Ze 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)d0S)2r7z Implements 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_valrcCs||_||_td|_t|tr6|j|_|j|_||_t|tr\|j|_|j|_|j|_dS|dkrrtd|_dS|dkrt||_n t|||_dS)z :param value: either an integer numerator, a float/rational/other number, or an IFDRational :param denominator: Optional integer denominator rNrnan) rAr@floatrB isinstancer numerator denominatorr7)selfvaluerGrrr!__init__3s$     zIFDRational.__init__cCs|jS)N)r@)arrr!rFQszIFDRational.numeratorcCs|jS)N)rA)rKrrr!rGUszIFDRational.denominatorcCs.|jdkr|j|jfS|j|}|j|jfS)z :param max_denominator: Integer, the maximum denominator value :returns: Tuple of (numerator, denominator) r)rGrFrBZlimit_denominator)rHZmax_denominatorfrrr!r8Ys   zIFDRational.limit_rationalcCstt|jS)N)strrDrB)rHrrr!__repr__fszIFDRational.__repr__cCs |jS)N)rB__hash__)rHrrr!rOiszIFDRational.__hash__cCs |j|kS)N)rB)rHotherrrr!__eq__lszIFDRational.__eq__csfdd}|S)Ncst|j|S)N)getattrrB)rHargs)oprr!delegatepsz'IFDRational._delegate..delegater)rTrUr)rTr! _delegateos zIFDRational._delegate__add____radd____sub____rsub____div____rdiv____mul____rmul__ __truediv__ __rtruediv__ __floordiv__ __rfloordiv____mod____rmod____pow____rpow____pos____neg____abs__ __trunc____lt____gt____le____ge__ __nonzero____ceil__ __floor__ __round__N)r)*__name__ __module__ __qualname____doc__ __slots__rJpropertyrFrGr8rNrOrQrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrrrr!r7%sL    r7c @seZdZdZd^ddZeddZeddZed dZej d d Zd d Z ddZ ddZ ddZ ddZddZesddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zeeeejd,d-fejd.d/fej d0d1fej!d2d3fej"d4d5fej#d6d7fej$d8d9fged:d:d_dd?Z&ed@d:d`dAdBZ'ed@dCdDZ(edEdFdadGdHZ)edEdIdJZ*edKd:dbdLdMZ+edKdNdOZ,edPdFdcdQdRZ-edPdSdTZ.dUdVZ/dWdXZ0dddZd[Z1d\d]Z2dS)eImageFileDirectory_v2aThis 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 `~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 ~PIL.TiffTags.TYPES` .. versionadded:: 3.0.0 II*NcCs|ddtkrtd||dk r(|n |dd|_|jtkrHd|_n|jtkrZd|_ntd||d|dd\|_d |_ dS) aInitialize 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. Nrz%not a TIFF file (header %r not valid)r>zImageFileDirectory_v2.cCs|jS)N)_offset)rHrrr!rrcCs|jS)N)r)rHrrr!rrcCs tddS)Nz"Not allowing setting of legacy api) Exception)rHrIrrr! legacy_apisz ImageFileDirectory_v2.legacy_apicCs(i|_i|_i|_i|_d|_d|_dS)N)_tags_v1_tags_v2_tagdatatagtype_nextr)rHrrr!rs zImageFileDirectory_v2.resetcCs tt|S)N)rMdict)rHrrr!__str__szImageFileDirectory_v2.__str__cCsdd|DS)z :returns: dict of name|key: value Returns the complete tag dictionary, with named tags where possible. cSsi|]\}}|t|jqSr)r lookupname)rcoderIrrr!r"sz/ImageFileDirectory_v2.named..)items)rHrrr!namedszImageFileDirectory_v2.namedcCstt|jt|jBS)N)lensetrr)rHrrr!__len__szImageFileDirectory_v2.__len__cCsf||jkr>|j|}|j|}|j|\}}||||j||<|j|}|jrbt|ttfsb|f}|S)N)rrr_load_dispatchrrEtuplebytes)rHtagdatatypsizehandlerr9rrr! __getitem__s    z!ImageFileDirectory_v2.__getitem__cCs||jkp||jkS)N)rr)rHrrrr! __contains__sz"ImageFileDirectory_v2.__contains__cCs||kS)Nr)rHrrrr!has_keyszImageFileDirectory_v2.has_keycCs||||jdS)N)_setitemr)rHrrIrrr! __setitem__sz!ImageFileDirectory_v2.__setitem__c s<tttf}ts|tf7}t|t||r2|gn|}||jkrj rVj |j|<ntj |j|<t dd|Drtj |j|<nt dd|Drt dd|Drtj |j|<n tj|j|<nTt dd|Drtj|j|<n4tr t dd|Drtj|j|<n tj|j|<|j|tj krNtrNt|trF|ddn|g}n |j|tj krnd d |D}tfd d|D}|r|jn|j}jd ksˆjdkr0t|d kr0|s0|r|j|tj tjgkr|f}y|\||<Wn8tk r,td |t|f|d||<YnXn|||<dS)Ncss|]}t|tVqdS)N)rEr7)rr rrr! +sz1ImageFileDirectory_v2._setitem..css|]}t|tVqdS)N)rEint)rr rrr!r-scss|]}|dkVqdS)iNr)rr rrr!r.scss|]}t|tVqdS)N)rErD)rr rrr!r2scss|]}t|tVqdS)N)rErM)rr rrr!r6sasciireplacecSs"g|]}t|trt|n|qSr)rErrD)rr rrr! Asz2ImageFileDirectory_v2._setitem..c3s|]}|VqdS)N)Zcvt_enum)rrI)inforr!rCsrz=Metadata Warning, tag %s had too many entries: %s, expected 1r)rrrMrunicoder rrErtype UNDEFINEDallZRATIONALSHORTLONGDOUBLEASCIIencoderrrlengthrZSIGNED_RATIONAL ValueErrorwarningswarn)rHrrIrZ basetypesvaluesdestr)rr!rsR          zImageFileDirectory_v2._setitemcCs.|j|d|j|d|j|ddS)N)rpoprr)rHrrrr! __delitem__dsz!ImageFileDirectory_v2.__delitem__cCstt|jt|jBS)N)iterrrr)rHrrr!__iter__iszImageFileDirectory_v2.__iter__cCst|j||S)N)structunpackr)rHfmtrrrr!rlszImageFileDirectory_v2._unpackcGstj|j|f|S)N)rpackr)rHrrrrr!_packoszImageFileDirectory_v2._packcsfdd}|S)NcsBddlm}|jdr2|jdddd|<|ft<|S)Nr)rload_r_ )r rrs startswithrr)funcr)idxrrr! decoratorss    z9ImageFileDirectory_v2._register_loader..decoratorr)rrrr)rrr!_register_loaderrsz&ImageFileDirectory_v2._register_loadercsfdd}|S)Ncs |t<|S)N)_write_dispatch)r)rrr!r~sz9ImageFileDirectory_v2._register_writer..decoratorr)rrr)rr!_register_writer}s z&ImageFileDirectory_v2._register_writercsXddlm}|\}}|||<tddfdd ft|<fddt|<dS) Nr)r=Tcs|dt||S)Nz{}{})rformatr)rHrr)rrrr!rsz7ImageFileDirectory_v2._register_basic..csdfdd|DS)Nrc3s|]}|VqdS)N)r)rrI)rrHrr!rszJImageFileDirectory_v2._register_basic....)join)rHr)r)rHr!rs)T)r rrcalcsizerr)Z idx_fmt_namerrrr)rrr!_register_basics  z%ImageFileDirectory_v2._register_basicHshortr$longbz signed bytehz signed shortlz signed longrLrDddoublerTcCs|S)Nr)rHrrrrr! load_byteszImageFileDirectory_v2.load_bytecCs|S)Nr)rHrrrr! write_bytesz ImageFileDirectory_v2.write_bytercCs"|dr|dd}|ddS)Nr5zlatin-1r)endswithdecode)rHrrrrr! load_strings  z!ImageFileDirectory_v2.load_stringcCs,tjjdkr|dd}d|dddS)Nrrrrr)sys version_infomajorrr)rHrIrrr! write_strings  z"ImageFileDirectory_v2.write_stringrrcsV|dt|d|}fddtfddt|ddd|dddDS) Nz{}Lrcsr ||fSt||S)N)r7)rKr)rrr!combinesz4ImageFileDirectory_v2.load_rational..combinec3s|]\}}||VqdS)Nr)rnumdenom)rrr!rsz6ImageFileDirectory_v2.load_rational..rr)rrrrzip)rHrrvalsr)rrr! load_rationals z#ImageFileDirectory_v2.load_rationalcsdfdd|DS)Nrc3s"|]}jdt|dVqdS)2LlN)r)rr;)rfrac)rHrr!rsz7ImageFileDirectory_v2.write_rational..)r)rHrr)rHr!write_rationalsz$ImageFileDirectory_v2.write_rationalrcCs|S)Nr)rHrrrrr!load_undefinedsz$ImageFileDirectory_v2.load_undefinedcCs|S)Nr)rHrIrrr!write_undefinedsz%ImageFileDirectory_v2.write_undefined csV|dt|d|}fddtfddt|ddd|dddDS) Nz{}lrcsr ||fSt||S)N)r7)rKr)rrr!rsz;ImageFileDirectory_v2.load_signed_rational..combinec3s|]\}}||VqdS)Nr)rrr)rrr!rsz=ImageFileDirectory_v2.load_signed_rational..rr)rrrrr)rHrrrr)rrr!load_signed_rationals z*ImageFileDirectory_v2.load_signed_rationalcsdfdd|DS)Nrc3s"|]}jdt|dVqdS)ri@N)r)rr;)rr)rHrr!rsz>ImageFileDirectory_v2.write_signed_rational..)r)rHrr)rHr!write_signed_rationalsz+ImageFileDirectory_v2.write_signed_rationalcCs2||}t||kr.tdd|t|f|S)NzCorrupt EXIF data. z,Expecting to read %d bytes but only got %d. )readrIOError)rHfprretrrr! _ensure_reads   z"ImageFileDirectory_v2._ensure_readc Cs|||_yxt|d||ddD]j}|d||d\}}}}trt|j }t |d}t d||||fdd y|j |\} } Wn$tk rtrt d |w6YnX|| } | d kr(|} |d |\} trt d | | fdd || t|| }|| n |d| }t|| kr\td| t||fq6|sdq6||j|<||j|<tr6| dkrt d| q6t d||q6W|d ||d \|_Wn2tk r}ztt|dSd}~XYnXdS)NrrrHHL4sr%unknownztag: %s (%d) - type: %s (%d)r)endz- unsupported typerr$z$Tag Location: %s - Data Location: %szXPossibly corrupt EXIF data. Expecting to read %d bytes but only got %d. Skipping tag %sr(z- value: z- value:)rtellrrangerrDEBUGr rrrgetprintrKeyErrorseekr _safe_readrrrrrrrrM)rHrirrcountrtagnametypnameZ unit_sizerrhereoffsetmsgrrr!loads\ &            zImageFileDirectory_v2.loadrc Cs|dt|j}g}|t|t|jdd}d}x^t|jD]J\}}|tkrdt|}|j|}trt d|||ft |t r|n|f}|j ||f|} trt |j} t|d} t d| || |fddt| d krt d t| n t d ||t jt jt jgkr.t| } nt|} t| dkrb|||| | dd d fqJ|||| |d|| f|t| ddd7}qJW|dk r||\}}} }} | rtd|d|d|d|}||| || f||<xP|D]H\}}} }} tdkr(t ||| t|t| ||d||| |7}qW|d7}x6|D].\}}} }} || 7}t| d@rR|d 7}qRW|S)Nrr%rzTag %s, Type: %s, Value: %srzsave: %s (%d) - type: %s (%d)r)rr&z- value: z- value:rrr$rrz&multistrip support not yet implementedrrs)rrrsortedr STRIPOFFSETSrrrrrErrr rrrZBYTErrappendljustNotImplementedErrorrrepr) rHr resultentriesZ stripoffsetsrrIrrrrrrrrr!tobytes%sX       zImageFileDirectory_v2.tobytescCsN|dkr&||j|ddd|}||}|||t|S)NrZHL*r)rwriter~rrr)rHrr rrrr!savehs    zImageFileDirectory_v2.save)rzN)T)T)T)T)T)r)3rsrtrurvrJrxr3r rsetterrrrrrrrrrrrrrrrrrlistmapr rrZ SIGNED_BYTEZ SIGNED_SHORTZ SIGNED_LONGFLOATrrrrrrrrrrrrr rrrrrr!rysh     F             > CryrrrZwrite_c@sleZdZdZddZeddZeddZeddZ d d Z d d Z d dZ ddZ ddZddZdS)ImageFileDirectory_v1aThis 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, `~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`. Values are returned as a tuple. .. deprecated:: 3.0.0 cOstj|f||d|_dS)NT)ryrJr)rHrSkwargsrrr!rJszImageFileDirectory_v1.__init__cCs|jS)N)r)rHrrr!rrzImageFileDirectory_v1.cCs|jS)N)r)rHrrr!rrcCs(||jd}|j|_|j|_|j|_|S)a3 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` )r3)r3rrr)clsoriginalifdrrr!from_v2s zImageFileDirectory_v1.from_v2cCs4t|jd}t|j|_t|j|_t|j|_|S)a3 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` )r3)ryr3rrrr)rHr!rrr!to_v2s    zImageFileDirectory_v1.to_v2cCs||jkp||jkS)N)rr)rHrrrr!rsz"ImageFileDirectory_v1.__contains__cCstt|jt|jBS)N)rrrr)rHrrr!rszImageFileDirectory_v1.__len__cCstt|jt|jBS)N)rrrr)rHrrr!rszImageFileDirectory_v1.__iter__cCs xdD]}||||qWdS)N)FT)r)rHrrIrrrr!rs z!ImageFileDirectory_v1.__setitem__cCsr||jkrP|j|}|j|}|j|\}}x"dD]}|||||||q2W|j|}t|ttfsn|f}|S)N)FT)rrrrrrErr)rHrrrrrlegacyr9rrr!rs     z!ImageFileDirectory_v1.__getitem__N)rsrtrurvrJrxtagsZtagdata classmethodr"r#rrrrrrrrr!r~s   rcseZdZdZdZdZddZeddZedd Z d d Z d d Z ddZ eddZ e jddZ fddZddZddZddZddZZS) TiffImageFileZTIFFz Adobe TIFFFcCs||jd}t||_d|_|_|jj|_|_d|_ |j|_ g|_ d|_ t rntdtd|jtd||ddS)z#Open the first image in a TIFF filerNr5z*** TiffImageFile._open ***z - __first:z- ifh: r)rrrytag_v2rr!rZ_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_TiffImageFile__fp _frame_pos _n_framesrr_seek)rHrrrr!_opens     zTiffImageFile._opencCsT|jdkrN|}|t|jx |jdkrB||dq$W|||jS)Nr)r-rr.rr,r)rHcurrentrrr!n_framess   zTiffImageFile.n_framescCs|jS)N) _is_animated)rHrrr! is_animatedszTiffImageFile.is_animatedcCs<||sdS||t|jtj|j|j|_dS)z%Select a given frame as current imageN) Z _seek_checkr.rZ_decompression_bomb_checkrr=newmodeim)rHframerrr!r s    zTiffImageFile.seekcCs"|j|_xt|j|kr|js&tdtrHtd||j|j|j f|j |j |j|j |jtrtd|j |j |j|j j|_|jdkr|d|_t|jdkr|jdk|_|jd7_q W|j |j||j |jt|j |_|_||_|dS)Nzno more images in TIFF filez9Seeking to frame %s, on frame %s, __next %s, location: %szLoading tags, location: %srr)r+rrr,r)EOFErrorrrr*rrrr(r rr-r2rr"rr!_setup)rHr7rrr!r.s2     zTiffImageFile._seekcCs|jS)zReturn the current frame number)r*)rHrrr!r6szTiffImageFile.tellcCs|jS)N)_size)rHrrr!r:szTiffImageFile.sizecCstdt||_dS)NzSetting the size of a TIFF image directly is deprecated, and will be removed in a future version. Use the resize method instead.)rrDeprecationWarningr:)rHrIrrr!r>scs|jr|Stt|S)N)use_load_libtiff _load_libtiffsuperr'r )rH) __class__rr!r GszTiffImageFile.loadcCs`|jrPtjtjtjtjtjtjtjd |j}|dk rP|j ||_ |j j |_ |js\d|_dS)N)rrrrrrrT)_tile_orientationrZFLIP_LEFT_RIGHTZ ROTATE_180ZFLIP_TOP_BOTTOMZ TRANSPOSEZ ROTATE_270Z TRANSVERSEZ ROTATE_90rr6Z transposerr:r2!_close_exclusive_fp_after_loading)rHmethodrrr!load_endLs  zTiffImageFile.load_endc Cstj|}|jdkrtd|js(|S|t|jdksFtd|jdd}t|jdd}y6t|jdot |j }t|jdr|j Wntk rd }YnX|r||d <t |jd t||j}y||j|Wntk r td YnX|jo|j }t|jd rNtr8td||j\}}nd|rtrbtd|st|jd|d\}}n.trtd|jd||j\}}g|_d|_||r|jd|_|dkrt|tj|S)z] Overload method triggered when we detect a compressed tiff Calls out to libtiff Nzcannot load this imagerzNot exactly one tilerrfilenoflushFrlibtiffzCouldn't set the imagegetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.sfpfpz+don't have fileno or getvalue. just reading)rr tilerZ load_preparerrhasattrrosduprDrEZ _getdecoderr5rZ decoderconfigsetimager6rZ _exclusive_fpr2rrrrGrrreadonlyrCclose) rHZpixelZextentsrSrdecoderZ close_self_fpnerrrrr!r=`s`         zTiffImageFile._load_libtiffc Csd|jkrtdt|jtd|_|jtd|_|jtd}|jdkrRd}|jt d}t rt dt d|jt d |t d |jt d |t d |j d t |jt}t |jt}||f|_t rt d|j|jtd}t|dkr(t|t|kr dkr(nnd}|jtd}|jtd}|dkrTd}n|dkrdd}nd}|t|7}|t|krt|dkr||}|jj|||||f} t rt d| yt| \|_} Wn,tk rt rt dtdYnXt rt d| t d|j|j|jd<|jtd} |jtd} | r| r|jt } | dkrt | dt | df|jd<nx| dkrt | ddt | ddf|jd<nF| dkrt | dt | df|jd<| | f|jd <n| | f|jd <d}}}g|_!t"p|jd!k|_#|j#r|dkrj| ddd| dd} t r\t d| t| \|_} | d"krxd#} d$| kr| $d$d%} d&| kr| $d&d%} | |jd'|jj%f}|j!&d(dd||fd|fn\t'|jkst(|jkrt'|jkr|jt'}|jt)|}|jd}n"|jt(}|jd)}|jd*}x|D]}|||krj|t*|d+}nd}| }|jdkr| |}||}|t |df}|j!&|j||t|||t|||f||f||}||jdkrFd||}}||jdkrFd}}|d7}qFWnt r*t d,td-t+|jkrN|jt+|jd.<|jd/krd0d1|jt,D}t-.d2d3/||_0|jd4|_1dS)5z-Setup this image object based on current tagsiz+Windows Media Photo files not yet supportedrrrrz*** Summary ***z- compression:z- photometric_interpretation:z- planar_configuration:z - fill_order:z- YCbCr subsampling:iz- size:)rr)rrrrrrz format key:z- unsupported formatzunknown pixel modez - raw mode:z - pil mode: compressionrg?dpigRQ@N resolutionrzI;16zI;16Nz;16Bz;16Nz;16LFrFiBiCrz- unsupported data organizationzunknown data organization icc_profile)r.r/cSsg|]}t|dqS)r)r )rrrrr!rsz(TiffImageFile._setup..zRGB;Lri)2r(rCOMPRESSION_INFOr COMPRESSION _compressionPLANAR_CONFIGURATION_planar_configurationPHOTOMETRIC_INTERPRETATION FILLORDERrrrr IMAGEWIDTH IMAGELENGTHr:r SAMPLEFORMATrmaxmin BITSPERSAMPLE EXTRASAMPLESr3 OPEN_INFOr5rr}r X_RESOLUTION Y_RESOLUTIONRESOLUTION_UNITrH READ_LIBTIFFr<rr rr TILEOFFSETS ROWSPERSTRIPsum ICCPROFILECOLORMAPr rrpaletter@)rHphotoZ fillorderZxsizeZysizeZ sampleFormatZ bps_tupleZ extra_tupleZ bps_countkeyrawmodeZxresZyresZresunitxyZlayerrKoffsetsrwr strideZ tile_rawmodernrrr!r9s        2            (                    zTiffImageFile._setupcCsBz4y|j|jkr|jWntk r0YnXWdd|_XdS)N)r+rrNAttributeError)rHrrr! _close__fps   zTiffImageFile._close__fp)rsrtrurformat_descriptionrAr/rxr1r3rr.rrrr rCr=r9rx __classcell__rr)r?r!r's"    ]Hr'r#r$r*r.r/zI;32SzI;16zI;16SzF;32Fr+r-r,r0YCbCrr1zI;32BSzI;16BzI;16BSzF;32BF)r#r$r*r.r/r'zI;16zI;16Sr)r+r-r,r0r{r1zI;32BSzI;16BzI;16BSzF;32BFc! Cs@yt|j\}}}}}}Wn"tk r<td|jYnXt|d} |jd|jd} | dkrjd} tpt| dk} t |dd| t <|j d| t <|j d| t <|jdi} trtd t| t| tr| } xF| D]>} | | | | <y| j| | j| <Wqtk rYqXqWt|d rrxFttttttfD]2} | |jkr<|j| | | <|jj| | j| <qt)t0t1t?g}i}|d|t%<i}t|d(r|j@}xtAB| 7t |d i7|7D]\}}|tCjDkrtCE|jFtCjGkrpqDtHjIJtKtHjIJd)krqD|| jkr| j|||<n*t|t$tLtMtNfstOsDt|tPs֐qD||krD||krDt|tOrtMntPr|Qd*d+d,||<n"t|tRr0tL|||<n|||<qDWtrXtd-t6|7|jd.krhd/}t|7}|S|| ||||f}tTU|jd0||jV}|W|j+d1|j x.|Qd2\}}}|s|X||rPqW|dkr*td3|n.| Y|} tZ[||dd1|j | ||dffgd4|jkr<| |_\dS)5Nzcannot write mode %s as TIFF)r3rRrrZrrZtiffinfozTiffinfo Keys: %sr(rU descriptionrTZ x_resolutionZ y_resolutionZresolution_unitZsoftware date_timeZartist copyrightrSrg?)r)r.r/r+zRGB;Lcss|]}t|dVqdS)rN)r )rr rrr!rsz_save..rrqualitydzInvalid quality settingrz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz Items: %srDrz4.0rrrzConverted items: %s)zI;16BzI;16zI;16NrF)rri@z(encoder error %d when writing image file_debug_multipage)] SAVE_INFOr5rrry encoderinforr WRITE_LIBTIFFrRrYrr]r^rrrrErr#rrrIrgrerfIPTC_NAA_CHUNKPHOTOSHOP_CHUNKXMPr(rlIMAGEDESCRIPTIONSOFTWARE DATE_TIMEARTIST COPYRIGHTrrbrSAMPLESPERPIXELrcr_r[r6Z getpaletterrmrjSTRIPBYTECOUNTSrCOMPRESSION_INFO_REVrWr JPEGQUALITYr rrrJrKrDioUnsupportedOperationREFERENCEBLACKWHITETRANSFERFUNCTIONr itertoolschainr Z LIBTIFF_CORErrr distutilsversionZ StrictVersionr?rDrMrrrrr7sortrZ _getencoder encoderconfigrLrrr _saver)!r6rfilenamerqr3rorbitsextrar!rRrFrrprrSZlutrvr_fptypesZ blocklistZattsZ legacy_ifdrrIr%rKersrr rrr!rs                 "          &          rc @seZdZdddddddddddddg Zdddd d d hZd:d dZddZddZddZddZ ddZ ddZ e j fddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd;d7d8Zd9S)<AppendingTiffWriterrrrrrii iDiii FcCszt|dr||_d|_nJ||_d|_yt||r4dnd|_Wn"tk r`t|d|_YnX|j|_| dS)NrFTzw+bzr+b) rIrLclose_fprropenrr beginningsetup)rHfnr4rrr!rJs  zAppendingTiffWriter.__init__cCs|j|jtjd|_d|_|jd|_}|s>d|_ dSd|_ |dkrX| dn|dkrl| dnt d | | dS) NrrTFsII*r|sMM*r{zInvalid TIFF file header)rLrrrJSEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPagerIIMMisFirst setEndian RuntimeErrorskipIFDsgoToEnd)rHrrrr!rs  zAppendingTiffWriter.setupcCs|jr dS|j|j|jd}|s,dS||jkr>td|}||j7}|j|j| ||j|| dS)Nrz1IIMM of new page doesn't match IIMM of first page) rrLrrrrrreadLongr writeLongfixIFD)rHr IFDoffsetrrr!finalizes     zAppendingTiffWriter.finalizecCs||dS)N)rr)rHrrr!newFrameszAppendingTiffWriter.newFramecCs|S)Nr)rHrrr! __enter__szAppendingTiffWriter.__enter__cCs|jr|dS)NF)rrN)rHexc_type exc_value tracebackrrr!__exit__szAppendingTiffWriter.__exit__cCs|j|jS)N)rLrr)rHrrr!rszAppendingTiffWriter.tellcCs*|tjkr||j7}|j|||S)N)rJrrrLrr)rHr whencerrr!rs  zAppendingTiffWriter.seekcCsb|jdtj|j}d|d}d|kr:dkrRnn|jtt||j|_dS)Nrr&) rLrrJSEEK_ENDrrr bytearrayr)rHposZpadBytesrrr!rs   zAppendingTiffWriter.goToEndcCs.||_|jd|_|jd|_|jd|_dS)Nr$rZHHL)endianlongFmtshortFmt tagFormat)rHrrrr!rs  zAppendingTiffWriter.setEndiancCsTxN|}|dkr$|jd|_P|j||}|j|dtjqWdS)Nrrr%)rrLrrr readShortrJSEEK_CUR)rHrnumTagsrrr!rs zAppendingTiffWriter.skipIFDscCs |j|S)N)rLr)rHrrrr!rszAppendingTiffWriter.writecCst|j|jd\}|S)Nr)rrrrLr)rHrIrrr!rszAppendingTiffWriter.readShortcCst|j|jd\}|S)Nr)rrrrLr)rHrIrrr!rszAppendingTiffWriter.readLongcCsF|jdtj|jt|j|}|dk rB|dkrBtd|dS)Nrz wrote only %u bytes but wanted 4) rLrrJrrrrrr)rHrI bytesWrittenrrr!rewriteLastShortToLongsz*AppendingTiffWriter.rewriteLastShortToLongcCsF|jdtj|jt|j|}|dk rB|dkrBtd|dS)Nrrz wrote only %u bytes but wanted 2) rLrrJrrrrrr)rHrIrrrr!rewriteLastShort!sz$AppendingTiffWriter.rewriteLastShortcCsF|jdtj|jt|j|}|dk rB|dkrBtd|dS)Nrz wrote only %u bytes but wanted 4) rLrrJrrrrrr)rHrIrrrr!rewriteLastLong'sz#AppendingTiffWriter.rewriteLastLongcCs6|jt|j|}|dk r2|dkr2td|dS)Nrz wrote only %u bytes but wanted 2)rLrrrrr)rHrIrrrr! writeShort-szAppendingTiffWriter.writeShortcCs6|jt|j|}|dk r2|dkr2td|dS)Nrz wrote only %u bytes but wanted 4)rLrrrrr)rHrIrrrr!r2szAppendingTiffWriter.writeLongcCs||jdS)N)rrLrN)rHrrr!rN7szAppendingTiffWriter.closec Cs|}xt|D]}t|j|jd\}}}|j|}||}|dk}|sl|} | |j 7} | | ||j kr|j } |r|j ||dk|dkd|j| dn0|j| |j ||dk|dkd|j| d} } q|r|jdtjqWdS)Nrrr)isShortisLong)rrrrrrLr fieldSizesrrrTagsr fixOffsetsrrJr) rHrrrZ fieldTyperZ fieldSizeZ totalSizeZisLocalr ZcurPosrrr!r;s.        zAppendingTiffWriter.fixIFDcCs|s|stdxt|D]}|r*|n|}||j7}|r|dkr|dkrXtd|||jdtj | t j |jdtj q|r| |q||qWdS)Nz offset is neither short nor longirznot implementedir)rrrrrrrLrrJrrr rrr)rHrrrrr rrr!r^s     zAppendingTiffWriter.fixOffsetsN)F)FF)rsrtrurrrJrrrrrrrrrrrrrrrrrrrrrNrrrrrr!rsH    #rc Cs|j}|j}t|dg}t|ds:|s:t|||S|}zt|t}xl|g|D]^}||_||_t|dszd} n|j } x6t | D]*} | | | t|||| qWqZWWdQRXWd| |XdS)N append_imagesr1r)rcopyrrrrIrrrr1rrr r) r6rrrrrZcur_idxtfZimsZnfrrrrr! _save_allvs(      rz.tifz.tiffz image/tiff)f __future__rrZdistutils.versionrrrrJrrrZ fractionsrZnumbersrrrr r r _binaryr r Z_utilrrcollections.abcr ImportError collections __version__rrhrZIFD_LEGACY_APIrrr]r^rbrWr[r\rrrrjrrerfrYrgrrrrZ PREDICTORrmrircr_Z JPEGTABLESrrrrrlZEXIFIFDrrZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATArVrrrdr2r4r;r?rrr7ryrrrsetattrrZImageFileDirectoryr'rrrrZ register_openrZ register_saveZregister_save_allZregister_extensionsZ register_mimerrrr!*s   v\ X>[o