<!DOCTYPE html> <!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> <!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PIL.TiffImagePlugin — Pillow (PIL Fork) 5.4.1 documentation</title> <script type="text/javascript" src="../../_static/js/modernizr.min.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script> <script type="text/javascript" src="../../_static/jquery.js"></script> <script type="text/javascript" src="../../_static/underscore.js"></script> <script type="text/javascript" src="../../_static/doctools.js"></script> <script type="text/javascript" src="../../_static/language_data.js"></script> <script type="text/javascript" src="../../_static/js/script.js"></script> <script type="text/javascript" src="../../_static/js/theme.js"></script> <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> <link rel="author" title="About these documents" href="../../about.html" /> <link rel="index" title="Index" href="../../genindex.html" /> <link rel="search" title="Search" href="../../search.html" /> </head> <body class="wy-body-for-nav"> <div class="wy-grid-for-nav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side"> <div class="wy-side-scroll"> <div class="wy-side-nav-search" > <a href="../../index.html" class="icon icon-home"> Pillow (PIL Fork) </a> <div class="version"> 5.4.1 </div> <div role="search"> <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get"> <input type="text" name="q" placeholder="Search docs" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> </div> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> <ul> <li class="toctree-l1"><a class="reference internal" href="../../installation.html">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="../../handbook/index.html">Handbook</a></li> <li class="toctree-l1"><a class="reference internal" href="../../reference/index.html">Reference</a></li> <li class="toctree-l1"><a class="reference internal" href="../../porting.html">Porting</a></li> <li class="toctree-l1"><a class="reference internal" href="../../about.html">About</a></li> <li class="toctree-l1"><a class="reference internal" href="../../releasenotes/index.html">Release Notes</a></li> <li class="toctree-l1"><a class="reference internal" href="../../deprecations.html">Deprecations and removals</a></li> </ul> </div> </div> </nav> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <nav class="wy-nav-top" aria-label="top navigation"> <i data-toggle="wy-nav-top" class="fa fa-bars"></i> <a href="../../index.html">Pillow (PIL Fork)</a> </nav> <div class="wy-nav-content"> <div class="rst-content"> <div role="navigation" aria-label="breadcrumbs navigation"> <ul class="wy-breadcrumbs"> <li><a href="../../index.html">Docs</a> »</li> <li><a href="../index.html">Module code</a> »</li> <li>PIL.TiffImagePlugin</li> <li class="wy-breadcrumbs-aside"> </li> </ul> <hr/> </div> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <h1>Source code for PIL.TiffImagePlugin</h1><div class="highlight"><pre> <span></span><span class="c1">#</span> <span class="c1"># The Python Imaging Library.</span> <span class="c1"># $Id$</span> <span class="c1">#</span> <span class="c1"># TIFF file handling</span> <span class="c1">#</span> <span class="c1"># TIFF is a flexible, if somewhat aged, image file format originally</span> <span class="c1"># defined by Aldus. Although TIFF supports a wide variety of pixel</span> <span class="c1"># layouts and compression methods, the name doesn't really stand for</span> <span class="c1"># "thousands of incompatible file formats," it just feels that way.</span> <span class="c1">#</span> <span class="c1"># To read TIFF data from a stream, the stream must be seekable. For</span> <span class="c1"># progressive decoding, make sure to use TIFF files where the tag</span> <span class="c1"># directory is placed first in the file.</span> <span class="c1">#</span> <span class="c1"># History:</span> <span class="c1"># 1995-09-01 fl Created</span> <span class="c1"># 1996-05-04 fl Handle JPEGTABLES tag</span> <span class="c1"># 1996-05-18 fl Fixed COLORMAP support</span> <span class="c1"># 1997-01-05 fl Fixed PREDICTOR support</span> <span class="c1"># 1997-08-27 fl Added support for rational tags (from Perry Stoll)</span> <span class="c1"># 1998-01-10 fl Fixed seek/tell (from Jan Blom)</span> <span class="c1"># 1998-07-15 fl Use private names for internal variables</span> <span class="c1"># 1999-06-13 fl Rewritten for PIL 1.0 (1.0)</span> <span class="c1"># 2000-10-11 fl Additional fixes for Python 2.0 (1.1)</span> <span class="c1"># 2001-04-17 fl Fixed rewind support (seek to frame 0) (1.2)</span> <span class="c1"># 2001-05-12 fl Added write support for more tags (from Greg Couch) (1.3)</span> <span class="c1"># 2001-12-18 fl Added workaround for broken Matrox library</span> <span class="c1"># 2002-01-18 fl Don't mess up if photometric tag is missing (D. Alan Stewart)</span> <span class="c1"># 2003-05-19 fl Check FILLORDER tag</span> <span class="c1"># 2003-09-26 fl Added RGBa support</span> <span class="c1"># 2004-02-24 fl Added DPI support; fixed rational write support</span> <span class="c1"># 2005-02-07 fl Added workaround for broken Corel Draw 10 files</span> <span class="c1"># 2006-01-09 fl Added support for float/double tags (from Russell Nelson)</span> <span class="c1">#</span> <span class="c1"># Copyright (c) 1997-2006 by Secret Labs AB. All rights reserved.</span> <span class="c1"># Copyright (c) 1995-1997 by Fredrik Lundh</span> <span class="c1">#</span> <span class="c1"># See the README file for information on usage and redistribution.</span> <span class="c1">#</span> <span class="kn">from</span> <span class="nn">__future__</span> <span class="k">import</span> <span class="n">division</span><span class="p">,</span> <span class="n">print_function</span> <span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">Image</span><span class="p">,</span> <span class="n">ImageFile</span><span class="p">,</span> <span class="n">ImagePalette</span><span class="p">,</span> <span class="n">TiffTags</span> <span class="kn">from</span> <span class="nn">._binary</span> <span class="k">import</span> <span class="n">i8</span><span class="p">,</span> <span class="n">o8</span> <span class="kn">from</span> <span class="nn">._util</span> <span class="k">import</span> <span class="n">py3</span> <span class="kn">from</span> <span class="nn">fractions</span> <span class="k">import</span> <span class="n">Fraction</span> <span class="kn">from</span> <span class="nn">numbers</span> <span class="k">import</span> <span class="n">Number</span><span class="p">,</span> <span class="n">Rational</span> <span class="kn">import</span> <span class="nn">io</span> <span class="kn">import</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="nn">os</span> <span class="kn">import</span> <span class="nn">struct</span> <span class="kn">import</span> <span class="nn">sys</span> <span class="kn">import</span> <span class="nn">warnings</span> <span class="kn">import</span> <span class="nn">distutils.version</span> <span class="kn">from</span> <span class="nn">.TiffTags</span> <span class="k">import</span> <span class="n">TYPES</span> <span class="k">try</span><span class="p">:</span> <span class="c1"># Python 3</span> <span class="kn">from</span> <span class="nn">collections.abc</span> <span class="k">import</span> <span class="n">MutableMapping</span> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="c1"># Python 2.7</span> <span class="kn">from</span> <span class="nn">collections</span> <span class="k">import</span> <span class="n">MutableMapping</span> <span class="n">__version__</span> <span class="o">=</span> <span class="s2">"1.3.5"</span> <span class="n">DEBUG</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># Needs to be merged with the new logging approach.</span> <span class="c1"># Set these to true to force use of libtiff for reading or writing.</span> <span class="n">READ_LIBTIFF</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">WRITE_LIBTIFF</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">IFD_LEGACY_API</span> <span class="o">=</span> <span class="kc">True</span> <span class="n">II</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">"II"</span> <span class="c1"># little-endian (Intel style)</span> <span class="n">MM</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">"MM"</span> <span class="c1"># big-endian (Motorola style)</span> <span class="c1">#</span> <span class="c1"># --------------------------------------------------------------------</span> <span class="c1"># Read TIFF files</span> <span class="c1"># a few tag names, just to make the code below a bit more readable</span> <span class="n">IMAGEWIDTH</span> <span class="o">=</span> <span class="mi">256</span> <span class="n">IMAGELENGTH</span> <span class="o">=</span> <span class="mi">257</span> <span class="n">BITSPERSAMPLE</span> <span class="o">=</span> <span class="mi">258</span> <span class="n">COMPRESSION</span> <span class="o">=</span> <span class="mi">259</span> <span class="n">PHOTOMETRIC_INTERPRETATION</span> <span class="o">=</span> <span class="mi">262</span> <span class="n">FILLORDER</span> <span class="o">=</span> <span class="mi">266</span> <span class="n">IMAGEDESCRIPTION</span> <span class="o">=</span> <span class="mi">270</span> <span class="n">STRIPOFFSETS</span> <span class="o">=</span> <span class="mi">273</span> <span class="n">SAMPLESPERPIXEL</span> <span class="o">=</span> <span class="mi">277</span> <span class="n">ROWSPERSTRIP</span> <span class="o">=</span> <span class="mi">278</span> <span class="n">STRIPBYTECOUNTS</span> <span class="o">=</span> <span class="mi">279</span> <span class="n">X_RESOLUTION</span> <span class="o">=</span> <span class="mi">282</span> <span class="n">Y_RESOLUTION</span> <span class="o">=</span> <span class="mi">283</span> <span class="n">PLANAR_CONFIGURATION</span> <span class="o">=</span> <span class="mi">284</span> <span class="n">RESOLUTION_UNIT</span> <span class="o">=</span> <span class="mi">296</span> <span class="n">SOFTWARE</span> <span class="o">=</span> <span class="mi">305</span> <span class="n">DATE_TIME</span> <span class="o">=</span> <span class="mi">306</span> <span class="n">ARTIST</span> <span class="o">=</span> <span class="mi">315</span> <span class="n">PREDICTOR</span> <span class="o">=</span> <span class="mi">317</span> <span class="n">COLORMAP</span> <span class="o">=</span> <span class="mi">320</span> <span class="n">TILEOFFSETS</span> <span class="o">=</span> <span class="mi">324</span> <span class="n">EXTRASAMPLES</span> <span class="o">=</span> <span class="mi">338</span> <span class="n">SAMPLEFORMAT</span> <span class="o">=</span> <span class="mi">339</span> <span class="n">JPEGTABLES</span> <span class="o">=</span> <span class="mi">347</span> <span class="n">COPYRIGHT</span> <span class="o">=</span> <span class="mi">33432</span> <span class="n">IPTC_NAA_CHUNK</span> <span class="o">=</span> <span class="mi">33723</span> <span class="c1"># newsphoto properties</span> <span class="n">PHOTOSHOP_CHUNK</span> <span class="o">=</span> <span class="mi">34377</span> <span class="c1"># photoshop properties</span> <span class="n">ICCPROFILE</span> <span class="o">=</span> <span class="mi">34675</span> <span class="n">EXIFIFD</span> <span class="o">=</span> <span class="mi">34665</span> <span class="n">XMP</span> <span class="o">=</span> <span class="mi">700</span> <span class="c1"># https://github.com/imagej/ImageJA/blob/master/src/main/java/ij/io/TiffDecoder.java</span> <span class="n">IMAGEJ_META_DATA_BYTE_COUNTS</span> <span class="o">=</span> <span class="mi">50838</span> <span class="n">IMAGEJ_META_DATA</span> <span class="o">=</span> <span class="mi">50839</span> <span class="n">COMPRESSION_INFO</span> <span class="o">=</span> <span class="p">{</span> <span class="c1"># Compression => pil compression name</span> <span class="mi">1</span><span class="p">:</span> <span class="s2">"raw"</span><span class="p">,</span> <span class="mi">2</span><span class="p">:</span> <span class="s2">"tiff_ccitt"</span><span class="p">,</span> <span class="mi">3</span><span class="p">:</span> <span class="s2">"group3"</span><span class="p">,</span> <span class="mi">4</span><span class="p">:</span> <span class="s2">"group4"</span><span class="p">,</span> <span class="mi">5</span><span class="p">:</span> <span class="s2">"tiff_lzw"</span><span class="p">,</span> <span class="mi">6</span><span class="p">:</span> <span class="s2">"tiff_jpeg"</span><span class="p">,</span> <span class="c1"># obsolete</span> <span class="mi">7</span><span class="p">:</span> <span class="s2">"jpeg"</span><span class="p">,</span> <span class="mi">8</span><span class="p">:</span> <span class="s2">"tiff_adobe_deflate"</span><span class="p">,</span> <span class="mi">32771</span><span class="p">:</span> <span class="s2">"tiff_raw_16"</span><span class="p">,</span> <span class="c1"># 16-bit padding</span> <span class="mi">32773</span><span class="p">:</span> <span class="s2">"packbits"</span><span class="p">,</span> <span class="mi">32809</span><span class="p">:</span> <span class="s2">"tiff_thunderscan"</span><span class="p">,</span> <span class="mi">32946</span><span class="p">:</span> <span class="s2">"tiff_deflate"</span><span class="p">,</span> <span class="mi">34676</span><span class="p">:</span> <span class="s2">"tiff_sgilog"</span><span class="p">,</span> <span class="mi">34677</span><span class="p">:</span> <span class="s2">"tiff_sgilog24"</span><span class="p">,</span> <span class="p">}</span> <span class="n">COMPRESSION_INFO_REV</span> <span class="o">=</span> <span class="p">{</span><span class="n">v</span><span class="p">:</span> <span class="n">k</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">COMPRESSION_INFO</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span> <span class="n">OPEN_INFO</span> <span class="o">=</span> <span class="p">{</span> <span class="c1"># (ByteOrder, PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample,</span> <span class="c1"># ExtraSamples) => mode, rawmode</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"1"</span><span class="p">,</span> <span class="s2">"1;I"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"1"</span><span class="p">,</span> <span class="s2">"1;I"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"1"</span><span class="p">,</span> <span class="s2">"1;IR"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"1"</span><span class="p">,</span> <span class="s2">"1;IR"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"1"</span><span class="p">,</span> <span class="s2">"1"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"1"</span><span class="p">,</span> <span class="s2">"1"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"1"</span><span class="p">,</span> <span class="s2">"1;R"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"1"</span><span class="p">,</span> <span class="s2">"1;R"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;2I"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;2I"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;2IR"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;2IR"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;2"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;2"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;2R"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;2R"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;4I"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;4I"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;4IR"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;4IR"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;4"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;4"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;4R"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;4R"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;I"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;I"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;IR"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;IR"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;R"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="s2">"L;R"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">12</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"I;16"</span><span class="p">,</span> <span class="s2">"I;12"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"I;16"</span><span class="p">,</span> <span class="s2">"I;16"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"I;16B"</span><span class="p">,</span> <span class="s2">"I;16B"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"I"</span><span class="p">,</span> <span class="s2">"I;16S"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"I"</span><span class="p">,</span> <span class="s2">"I;16BS"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">3</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">32</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"F"</span><span class="p">,</span> <span class="s2">"F;32F"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="mi">3</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">32</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"F"</span><span class="p">,</span> <span class="s2">"F;32BF"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">32</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"I"</span><span class="p">,</span> <span class="s2">"I;32N"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">32</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"I"</span><span class="p">,</span> <span class="s2">"I;32S"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">32</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"I"</span><span class="p">,</span> <span class="s2">"I;32BS"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">3</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">32</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"F"</span><span class="p">,</span> <span class="s2">"F;32F"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">3</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">32</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"F"</span><span class="p">,</span> <span class="s2">"F;32BF"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"LA"</span><span class="p">,</span> <span class="s2">"LA"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"LA"</span><span class="p">,</span> <span class="s2">"LA"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"RGB"</span><span class="p">,</span> <span class="s2">"RGB"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"RGB"</span><span class="p">,</span> <span class="s2">"RGB"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"RGB"</span><span class="p">,</span> <span class="s2">"RGB;R"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"RGB"</span><span class="p">,</span> <span class="s2">"RGB;R"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBA"</span><span class="p">),</span> <span class="c1"># missing ExtraSamples</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBA"</span><span class="p">),</span> <span class="c1"># missing ExtraSamples</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"RGBX"</span><span class="p">,</span> <span class="s2">"RGBX"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"RGBX"</span><span class="p">,</span> <span class="s2">"RGBX"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span> <span class="p">(</span><span class="s2">"RGBX"</span><span class="p">,</span> <span class="s2">"RGBXX"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span> <span class="p">(</span><span class="s2">"RGBX"</span><span class="p">,</span> <span class="s2">"RGBXX"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span> <span class="p">(</span><span class="s2">"RGBX"</span><span class="p">,</span> <span class="s2">"RGBXXX"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span> <span class="p">(</span><span class="s2">"RGBX"</span><span class="p">,</span> <span class="s2">"RGBXXX"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBa"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBa"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBaX"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBaX"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBaXX"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBaXX"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBA"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBA"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBAX"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBAX"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBAXX"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBAXX"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">999</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBA"</span><span class="p">),</span> <span class="c1"># Corel Draw 10</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">999</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBA"</span><span class="p">),</span> <span class="c1"># Corel Draw 10</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"RGB"</span><span class="p">,</span> <span class="s2">"RGB;16L"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"RGB"</span><span class="p">,</span> <span class="s2">"RGB;16B"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBA;16L"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBA;16B"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"RGBX"</span><span class="p">,</span> <span class="s2">"RGBX;16L"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"RGBX"</span><span class="p">,</span> <span class="s2">"RGBX;16B"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBa;16L"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBa;16B"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBA;16L"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="s2">"RGBA;16B"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P;1"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P;1"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P;1R"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P;1R"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P;2"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P;2"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P;2R"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P;2R"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P;4"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P;4"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P;4R"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P;4R"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"PA"</span><span class="p">,</span> <span class="s2">"PA"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"PA"</span><span class="p">,</span> <span class="s2">"PA"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P;R"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="s2">"P;R"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"CMYK"</span><span class="p">,</span> <span class="s2">"CMYK"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"CMYK"</span><span class="p">,</span> <span class="s2">"CMYK"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"CMYK"</span><span class="p">,</span> <span class="s2">"CMYKX"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,)):</span> <span class="p">(</span><span class="s2">"CMYK"</span><span class="p">,</span> <span class="s2">"CMYKX"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span> <span class="p">(</span><span class="s2">"CMYK"</span><span class="p">,</span> <span class="s2">"CMYKXX"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span> <span class="p">(</span><span class="s2">"CMYK"</span><span class="p">,</span> <span class="s2">"CMYKXX"</span><span class="p">),</span> <span class="c1"># JPEG compressed images handled by LibTiff and auto-converted to RGB</span> <span class="c1"># Minimal Baseline TIFF requires YCbCr images to have 3 SamplesPerPixel</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"RGB"</span><span class="p">,</span> <span class="s2">"RGB"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"RGB"</span><span class="p">,</span> <span class="s2">"RGB"</span><span class="p">),</span> <span class="p">(</span><span class="n">II</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"LAB"</span><span class="p">,</span> <span class="s2">"LAB"</span><span class="p">),</span> <span class="p">(</span><span class="n">MM</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="p">()):</span> <span class="p">(</span><span class="s2">"LAB"</span><span class="p">,</span> <span class="s2">"LAB"</span><span class="p">),</span> <span class="p">}</span> <span class="n">PREFIXES</span> <span class="o">=</span> <span class="p">[</span> <span class="sa">b</span><span class="s2">"MM</span><span class="se">\x00\x2A</span><span class="s2">"</span><span class="p">,</span> <span class="c1"># Valid TIFF header with big-endian byte order</span> <span class="sa">b</span><span class="s2">"II</span><span class="se">\x2A\x00</span><span class="s2">"</span><span class="p">,</span> <span class="c1"># Valid TIFF header with little-endian byte order</span> <span class="sa">b</span><span class="s2">"MM</span><span class="se">\x2A\x00</span><span class="s2">"</span><span class="p">,</span> <span class="c1"># Invalid TIFF header, assume big-endian</span> <span class="sa">b</span><span class="s2">"II</span><span class="se">\x00\x2A</span><span class="s2">"</span><span class="p">,</span> <span class="c1"># Invalid TIFF header, assume little-endian</span> <span class="p">]</span> <span class="k">def</span> <span class="nf">_accept</span><span class="p">(</span><span class="n">prefix</span><span class="p">):</span> <span class="k">return</span> <span class="n">prefix</span><span class="p">[:</span><span class="mi">4</span><span class="p">]</span> <span class="ow">in</span> <span class="n">PREFIXES</span> <span class="k">def</span> <span class="nf">_limit_rational</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">max_val</span><span class="p">):</span> <span class="n">inv</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span> <span class="n">n_d</span> <span class="o">=</span> <span class="n">IFDRational</span><span class="p">(</span><span class="mi">1</span> <span class="o">/</span> <span class="n">val</span> <span class="k">if</span> <span class="n">inv</span> <span class="k">else</span> <span class="n">val</span><span class="p">)</span><span class="o">.</span><span class="n">limit_rational</span><span class="p">(</span><span class="n">max_val</span><span class="p">)</span> <span class="k">return</span> <span class="n">n_d</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="n">inv</span> <span class="k">else</span> <span class="n">n_d</span> <span class="k">def</span> <span class="nf">_libtiff_version</span><span class="p">():</span> <span class="k">return</span> <span class="n">Image</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">libtiff_version</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"Version "</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="c1">##</span> <span class="c1"># Wrapper for TIFF IFDs.</span> <span class="n">_load_dispatch</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">_write_dispatch</span> <span class="o">=</span> <span class="p">{}</span> <div class="viewcode-block" id="IFDRational"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.IFDRational">[docs]</a><span class="k">class</span> <span class="nc">IFDRational</span><span class="p">(</span><span class="n">Rational</span><span class="p">):</span> <span class="sd">""" Implements a rational class where 0/0 is a legal value to match</span> <span class="sd"> the in the wild use of exif rationals.</span> <span class="sd"> e.g., DigitalZoomRatio - 0.00/0.00 indicates that no digital zoom was used</span> <span class="sd"> """</span> <span class="sd">""" If the denominator is 0, store this as a float('nan'), otherwise store</span> <span class="sd"> as a fractions.Fraction(). Delegate as appropriate</span> <span class="sd"> """</span> <span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'_numerator'</span><span class="p">,</span> <span class="s1">'_denominator'</span><span class="p">,</span> <span class="s1">'_val'</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">denominator</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> :param value: either an integer numerator, a</span> <span class="sd"> float/rational/other number, or an IFDRational</span> <span class="sd"> :param denominator: Optional integer denominator</span> <span class="sd"> """</span> <span class="bp">self</span><span class="o">.</span><span class="n">_denominator</span> <span class="o">=</span> <span class="n">denominator</span> <span class="bp">self</span><span class="o">.</span><span class="n">_numerator</span> <span class="o">=</span> <span class="n">value</span> <span class="bp">self</span><span class="o">.</span><span class="n">_val</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Fraction</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_numerator</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">numerator</span> <span class="bp">self</span><span class="o">.</span><span class="n">_denominator</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">denominator</span> <span class="bp">self</span><span class="o">.</span><span class="n">_val</span> <span class="o">=</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">IFDRational</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_denominator</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">denominator</span> <span class="bp">self</span><span class="o">.</span><span class="n">_numerator</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">numerator</span> <span class="bp">self</span><span class="o">.</span><span class="n">_val</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">_val</span> <span class="k">return</span> <span class="k">if</span> <span class="n">denominator</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_val</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="s1">'nan'</span><span class="p">)</span> <span class="k">return</span> <span class="k">elif</span> <span class="n">denominator</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_val</span> <span class="o">=</span> <span class="n">Fraction</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_val</span> <span class="o">=</span> <span class="n">Fraction</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">denominator</span><span class="p">)</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">numerator</span><span class="p">(</span><span class="n">a</span><span class="p">):</span> <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="n">_numerator</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">denominator</span><span class="p">(</span><span class="n">a</span><span class="p">):</span> <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="n">_denominator</span> <div class="viewcode-block" id="IFDRational.limit_rational"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.IFDRational.limit_rational">[docs]</a> <span class="k">def</span> <span class="nf">limit_rational</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">max_denominator</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> :param max_denominator: Integer, the maximum denominator value</span> <span class="sd"> :returns: Tuple of (numerator, denominator)</span> <span class="sd"> """</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">denominator</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">numerator</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">denominator</span><span class="p">)</span> <span class="n">f</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_val</span><span class="o">.</span><span class="n">limit_denominator</span><span class="p">(</span><span class="n">max_denominator</span><span class="p">)</span> <span class="k">return</span> <span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">numerator</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">denominator</span><span class="p">)</span></div> <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_val</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_val</span><span class="o">.</span><span class="fm">__hash__</span><span class="p">()</span> <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_val</span> <span class="o">==</span> <span class="n">other</span> <span class="k">def</span> <span class="nf">_delegate</span><span class="p">(</span><span class="n">op</span><span class="p">):</span> <span class="k">def</span> <span class="nf">delegate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_val</span><span class="p">,</span> <span class="n">op</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="k">return</span> <span class="n">delegate</span> <span class="sd">""" a = ['add','radd', 'sub', 'rsub','div', 'rdiv', 'mul', 'rmul',</span> <span class="sd"> 'truediv', 'rtruediv', 'floordiv',</span> <span class="sd"> 'rfloordiv','mod','rmod', 'pow','rpow', 'pos', 'neg',</span> <span class="sd"> 'abs', 'trunc', 'lt', 'gt', 'le', 'ge', 'nonzero',</span> <span class="sd"> 'ceil', 'floor', 'round']</span> <span class="sd"> print("\n".join("__%s__ = _delegate('__%s__')" % (s,s) for s in a))</span> <span class="sd"> """</span> <span class="fm">__add__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__add__'</span><span class="p">)</span> <span class="fm">__radd__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__radd__'</span><span class="p">)</span> <span class="fm">__sub__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__sub__'</span><span class="p">)</span> <span class="fm">__rsub__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__rsub__'</span><span class="p">)</span> <span class="n">__div__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__div__'</span><span class="p">)</span> <span class="n">__rdiv__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__rdiv__'</span><span class="p">)</span> <span class="fm">__mul__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__mul__'</span><span class="p">)</span> <span class="fm">__rmul__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__rmul__'</span><span class="p">)</span> <span class="fm">__truediv__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__truediv__'</span><span class="p">)</span> <span class="fm">__rtruediv__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__rtruediv__'</span><span class="p">)</span> <span class="fm">__floordiv__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__floordiv__'</span><span class="p">)</span> <span class="fm">__rfloordiv__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__rfloordiv__'</span><span class="p">)</span> <span class="fm">__mod__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__mod__'</span><span class="p">)</span> <span class="fm">__rmod__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__rmod__'</span><span class="p">)</span> <span class="fm">__pow__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__pow__'</span><span class="p">)</span> <span class="fm">__rpow__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__rpow__'</span><span class="p">)</span> <span class="fm">__pos__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__pos__'</span><span class="p">)</span> <span class="fm">__neg__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__neg__'</span><span class="p">)</span> <span class="fm">__abs__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__abs__'</span><span class="p">)</span> <span class="n">__trunc__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__trunc__'</span><span class="p">)</span> <span class="fm">__lt__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__lt__'</span><span class="p">)</span> <span class="fm">__gt__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__gt__'</span><span class="p">)</span> <span class="fm">__le__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__le__'</span><span class="p">)</span> <span class="fm">__ge__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__ge__'</span><span class="p">)</span> <span class="n">__nonzero__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__nonzero__'</span><span class="p">)</span> <span class="n">__ceil__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__ceil__'</span><span class="p">)</span> <span class="n">__floor__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__floor__'</span><span class="p">)</span> <span class="fm">__round__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">'__round__'</span><span class="p">)</span></div> <div class="viewcode-block" id="ImageFileDirectory_v2"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2">[docs]</a><span class="k">class</span> <span class="nc">ImageFileDirectory_v2</span><span class="p">(</span><span class="n">MutableMapping</span><span class="p">):</span> <span class="sd">"""This class represents a TIFF tag directory. To speed things up, we</span> <span class="sd"> don't decode tags unless they're asked for.</span> <span class="sd"> Exposes a dictionary interface of the tags in the directory::</span> <span class="sd"> ifd = ImageFileDirectory_v2()</span> <span class="sd"> ifd[key] = 'Some Data'</span> <span class="sd"> ifd.tagtype[key] = 2</span> <span class="sd"> print(ifd[key])</span> <span class="sd"> 'Some Data'</span> <span class="sd"> Individual values are returned as the strings or numbers, sequences are</span> <span class="sd"> returned as tuples of the values.</span> <span class="sd"> The tiff metadata type of each item is stored in a dictionary of</span> <span class="sd"> tag types in</span> <span class="sd"> `~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types</span> <span class="sd"> are read from a tiff file, guessed from the type added, or added</span> <span class="sd"> manually.</span> <span class="sd"> Data Structures:</span> <span class="sd"> * self.tagtype = {}</span> <span class="sd"> * Key: numerical tiff tag number</span> <span class="sd"> * Value: integer corresponding to the data type from</span> <span class="sd"> ~PIL.TiffTags.TYPES`</span> <span class="sd"> .. versionadded:: 3.0.0</span> <span class="sd"> """</span> <span class="sd">"""</span> <span class="sd"> Documentation:</span> <span class="sd"> 'internal' data structures:</span> <span class="sd"> * self._tags_v2 = {} Key: numerical tiff tag number</span> <span class="sd"> Value: decoded data, as tuple for multiple values</span> <span class="sd"> * self._tagdata = {} Key: numerical tiff tag number</span> <span class="sd"> Value: undecoded byte string from file</span> <span class="sd"> * self._tags_v1 = {} Key: numerical tiff tag number</span> <span class="sd"> Value: decoded data in the v1 format</span> <span class="sd"> Tags will be found in the private attributes self._tagdata, and in</span> <span class="sd"> self._tags_v2 once decoded.</span> <span class="sd"> Self.legacy_api is a value for internal use, and shouldn't be</span> <span class="sd"> changed from outside code. In cooperation with the</span> <span class="sd"> ImageFileDirectory_v1 class, if legacy_api is true, then decoded</span> <span class="sd"> tags will be populated into both _tags_v1 and _tags_v2. _Tags_v2</span> <span class="sd"> will be used if this IFD is used in the TIFF save routine. Tags</span> <span class="sd"> should be read from tags_v1 if legacy_api == true.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ifh</span><span class="o">=</span><span class="sa">b</span><span class="s2">"II</span><span class="se">\052\0\0\0\0\0</span><span class="s2">"</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="sd">"""Initialize an ImageFileDirectory.</span> <span class="sd"> To construct an ImageFileDirectory from a real file, pass the 8-byte</span> <span class="sd"> magic header to the constructor. To only set the endianness, pass it</span> <span class="sd"> as the 'prefix' keyword argument.</span> <span class="sd"> :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets</span> <span class="sd"> endianness.</span> <span class="sd"> :param prefix: Override the endianness of the file.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="n">ifh</span><span class="p">[:</span><span class="mi">4</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">PREFIXES</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">SyntaxError</span><span class="p">(</span><span class="s2">"not a TIFF file (header </span><span class="si">%r</span><span class="s2"> not valid)"</span> <span class="o">%</span> <span class="n">ifh</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_prefix</span> <span class="o">=</span> <span class="n">prefix</span> <span class="k">if</span> <span class="n">prefix</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">ifh</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_prefix</span> <span class="o">==</span> <span class="n">MM</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_endian</span> <span class="o">=</span> <span class="s2">">"</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">_prefix</span> <span class="o">==</span> <span class="n">II</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_endian</span> <span class="o">=</span> <span class="s2">"<"</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">SyntaxError</span><span class="p">(</span><span class="s2">"not a TIFF IFD"</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span><span class="p">,</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unpack</span><span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="n">ifh</span><span class="p">[</span><span class="mi">4</span><span class="p">:])</span> <span class="bp">self</span><span class="o">.</span><span class="n">_legacy_api</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">prefix</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_prefix</span><span class="p">)</span> <span class="n">offset</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_offset</span><span class="p">)</span> <span class="n">legacy_api</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_legacy_api</span><span class="p">)</span> <span class="nd">@legacy_api</span><span class="o">.</span><span class="n">setter</span> <span class="k">def</span> <span class="nf">legacy_api</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Not allowing setting of legacy api"</span><span class="p">)</span> <div class="viewcode-block" id="ImageFileDirectory_v2.reset"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2.reset">[docs]</a> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tags_v1</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># will remain empty if legacy_api is false</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tags_v2</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># main tag storage</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tagdata</span> <span class="o">=</span> <span class="p">{}</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># added 2008-06-05 by Florian Hoech</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span> <span class="o">=</span> <span class="kc">None</span> <span class="bp">self</span><span class="o">.</span><span class="n">_offset</span> <span class="o">=</span> <span class="kc">None</span></div> <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span> <div class="viewcode-block" id="ImageFileDirectory_v2.named"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2.named">[docs]</a> <span class="k">def</span> <span class="nf">named</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> :returns: dict of name|key: value</span> <span class="sd"> Returns the complete tag dictionary, with named tags where possible.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="nb">dict</span><span class="p">((</span><span class="n">TiffTags</span><span class="o">.</span><span class="n">lookup</span><span class="p">(</span><span class="n">code</span><span class="p">)</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="k">for</span> <span class="n">code</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">items</span><span class="p">())</span></div> <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_tagdata</span><span class="p">)</span> <span class="o">|</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_tags_v2</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">):</span> <span class="k">if</span> <span class="n">tag</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tags_v2</span><span class="p">:</span> <span class="c1"># unpack on the fly</span> <span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tagdata</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="n">typ</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="n">size</span><span class="p">,</span> <span class="n">handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_load_dispatch</span><span class="p">[</span><span class="n">typ</span><span class="p">]</span> <span class="bp">self</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">legacy_api</span><span class="p">)</span> <span class="c1"># check type</span> <span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tags_v2</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">legacy_api</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">)):</span> <span class="n">val</span> <span class="o">=</span> <span class="n">val</span><span class="p">,</span> <span class="k">return</span> <span class="n">val</span> <span class="k">def</span> <span class="nf">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">):</span> <span class="k">return</span> <span class="n">tag</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tags_v2</span> <span class="ow">or</span> <span class="n">tag</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tagdata</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">py3</span><span class="p">:</span> <span class="k">def</span> <span class="nf">has_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">):</span> <span class="k">return</span> <span class="n">tag</span> <span class="ow">in</span> <span class="bp">self</span> <span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setitem</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">legacy_api</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_setitem</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">legacy_api</span><span class="p">):</span> <span class="n">basetypes</span> <span class="o">=</span> <span class="p">(</span><span class="n">Number</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">py3</span><span class="p">:</span> <span class="n">basetypes</span> <span class="o">+=</span> <span class="n">unicode</span><span class="p">,</span> <span class="c1"># noqa: F821</span> <span class="n">info</span> <span class="o">=</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">lookup</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span> <span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="n">value</span><span class="p">]</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">basetypes</span><span class="p">)</span> <span class="k">else</span> <span class="n">value</span> <span class="k">if</span> <span class="n">tag</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">:</span> <span class="k">if</span> <span class="n">info</span><span class="o">.</span><span class="n">type</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">info</span><span class="o">.</span><span class="n">type</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="mi">7</span> <span class="k">if</span> <span class="nb">all</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">IFDRational</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">values</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">RATIONAL</span> <span class="k">elif</span> <span class="nb">all</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">values</span><span class="p">):</span> <span class="k">if</span> <span class="nb">all</span><span class="p">(</span><span class="n">v</span> <span class="o"><</span> <span class="mi">2</span> <span class="o">**</span> <span class="mi">16</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">values</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">SHORT</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">LONG</span> <span class="k">elif</span> <span class="nb">all</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">float</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">values</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">DOUBLE</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</span> <span class="n">py3</span><span class="p">:</span> <span class="k">if</span> <span class="nb">all</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">values</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">ASCII</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># Never treat data as binary by default on Python 2.</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">ASCII</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">==</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">UNDEFINED</span> <span class="ow">and</span> <span class="n">py3</span><span class="p">:</span> <span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"ascii"</span><span class="p">,</span> <span class="s1">'replace'</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span> <span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="n">value</span><span class="p">]</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">==</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">RATIONAL</span><span class="p">:</span> <span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="nb">float</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="k">else</span> <span class="n">v</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">values</span><span class="p">]</span> <span class="n">values</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">info</span><span class="o">.</span><span class="n">cvt_enum</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">)</span> <span class="n">dest</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tags_v1</span> <span class="k">if</span> <span class="n">legacy_api</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tags_v2</span> <span class="c1"># Three branches:</span> <span class="c1"># Spec'd length == 1, Actual length 1, store as element</span> <span class="c1"># Spec'd length == 1, Actual > 1, Warn and truncate. Formerly barfed.</span> <span class="c1"># No Spec, Actual length 1, Formerly (<4.2) returned a 1 element tuple.</span> <span class="c1"># Don't mess with the legacy api, since it's frozen.</span> <span class="k">if</span> <span class="p">(</span><span class="n">info</span><span class="o">.</span><span class="n">length</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="ow">or</span> \ <span class="p">(</span><span class="n">info</span><span class="o">.</span><span class="n">length</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">values</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">legacy_api</span><span class="p">):</span> <span class="c1"># Don't mess with the legacy api, since it's frozen.</span> <span class="k">if</span> <span class="n">legacy_api</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">RATIONAL</span><span class="p">,</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">SIGNED_RATIONAL</span> <span class="p">]:</span> <span class="c1"># rationals</span> <span class="n">values</span> <span class="o">=</span> <span class="n">values</span><span class="p">,</span> <span class="k">try</span><span class="p">:</span> <span class="n">dest</span><span class="p">[</span><span class="n">tag</span><span class="p">],</span> <span class="o">=</span> <span class="n">values</span> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> <span class="c1"># We've got a builtin tag with 1 expected entry</span> <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span> <span class="s2">"Metadata Warning, tag </span><span class="si">%s</span><span class="s2"> had too many entries: "</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">, expected 1"</span> <span class="o">%</span> <span class="p">(</span> <span class="n">tag</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">values</span><span class="p">)))</span> <span class="n">dest</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">values</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># Spec'd length > 1 or undefined</span> <span class="c1"># Unspec'd, and length > 1</span> <span class="n">dest</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">values</span> <span class="k">def</span> <span class="nf">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tags_v2</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tags_v1</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tagdata</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_tagdata</span><span class="p">)</span> <span class="o">|</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_tags_v2</span><span class="p">))</span> <span class="k">def</span> <span class="nf">_unpack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fmt</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span> <span class="k">return</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_endian</span> <span class="o">+</span> <span class="n">fmt</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_pack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fmt</span><span class="p">,</span> <span class="o">*</span><span class="n">values</span><span class="p">):</span> <span class="k">return</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_endian</span> <span class="o">+</span> <span class="n">fmt</span><span class="p">,</span> <span class="o">*</span><span class="n">values</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_register_loader</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span> <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">func</span><span class="p">):</span> <span class="kn">from</span> <span class="nn">.TiffTags</span> <span class="k">import</span> <span class="n">TYPES</span> <span class="k">if</span> <span class="n">func</span><span class="o">.</span><span class="vm">__name__</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"load_"</span><span class="p">):</span> <span class="n">TYPES</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="o">=</span> <span class="n">func</span><span class="o">.</span><span class="vm">__name__</span><span class="p">[</span><span class="mi">5</span><span class="p">:]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"_"</span><span class="p">,</span> <span class="s2">" "</span><span class="p">)</span> <span class="n">_load_dispatch</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="o">=</span> <span class="n">size</span><span class="p">,</span> <span class="n">func</span> <span class="c1"># noqa: F821</span> <span class="k">return</span> <span class="n">func</span> <span class="k">return</span> <span class="n">decorator</span> <span class="k">def</span> <span class="nf">_register_writer</span><span class="p">(</span><span class="n">idx</span><span class="p">):</span> <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">func</span><span class="p">):</span> <span class="n">_write_dispatch</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="o">=</span> <span class="n">func</span> <span class="c1"># noqa: F821</span> <span class="k">return</span> <span class="n">func</span> <span class="k">return</span> <span class="n">decorator</span> <span class="k">def</span> <span class="nf">_register_basic</span><span class="p">(</span><span class="n">idx_fmt_name</span><span class="p">):</span> <span class="kn">from</span> <span class="nn">.TiffTags</span> <span class="k">import</span> <span class="n">TYPES</span> <span class="n">idx</span><span class="p">,</span> <span class="n">fmt</span><span class="p">,</span> <span class="n">name</span> <span class="o">=</span> <span class="n">idx_fmt_name</span> <span class="n">TYPES</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="o">=</span> <span class="n">name</span> <span class="n">size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="s2">"="</span> <span class="o">+</span> <span class="n">fmt</span><span class="p">)</span> <span class="n">_load_dispatch</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="o">=</span> <span class="n">size</span><span class="p">,</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">legacy_api</span><span class="o">=</span><span class="kc">True</span><span class="p">:</span> <span class="p">(</span> <span class="c1"># noqa: F821</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unpack</span><span class="p">(</span><span class="s2">"</span><span class="si">{}{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">//</span> <span class="n">size</span><span class="p">,</span> <span class="n">fmt</span><span class="p">),</span> <span class="n">data</span><span class="p">))</span> <span class="n">_write_dispatch</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">values</span><span class="p">:</span> <span class="p">(</span> <span class="c1"># noqa: F821</span> <span class="sa">b</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_pack</span><span class="p">(</span><span class="n">fmt</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">))</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">_register_basic</span><span class="p">,</span> <span class="p">[(</span><span class="n">TiffTags</span><span class="o">.</span><span class="n">SHORT</span><span class="p">,</span> <span class="s2">"H"</span><span class="p">,</span> <span class="s2">"short"</span><span class="p">),</span> <span class="p">(</span><span class="n">TiffTags</span><span class="o">.</span><span class="n">LONG</span><span class="p">,</span> <span class="s2">"L"</span><span class="p">,</span> <span class="s2">"long"</span><span class="p">),</span> <span class="p">(</span><span class="n">TiffTags</span><span class="o">.</span><span class="n">SIGNED_BYTE</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">,</span> <span class="s2">"signed byte"</span><span class="p">),</span> <span class="p">(</span><span class="n">TiffTags</span><span class="o">.</span><span class="n">SIGNED_SHORT</span><span class="p">,</span> <span class="s2">"h"</span><span class="p">,</span> <span class="s2">"signed short"</span><span class="p">),</span> <span class="p">(</span><span class="n">TiffTags</span><span class="o">.</span><span class="n">SIGNED_LONG</span><span class="p">,</span> <span class="s2">"l"</span><span class="p">,</span> <span class="s2">"signed long"</span><span class="p">),</span> <span class="p">(</span><span class="n">TiffTags</span><span class="o">.</span><span class="n">FLOAT</span><span class="p">,</span> <span class="s2">"f"</span><span class="p">,</span> <span class="s2">"float"</span><span class="p">),</span> <span class="p">(</span><span class="n">TiffTags</span><span class="o">.</span><span class="n">DOUBLE</span><span class="p">,</span> <span class="s2">"d"</span><span class="p">,</span> <span class="s2">"double"</span><span class="p">)]))</span> <div class="viewcode-block" id="ImageFileDirectory_v2.load_byte"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2.load_byte">[docs]</a> <span class="nd">@_register_loader</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="c1"># Basic type, except for the legacy API.</span> <span class="k">def</span> <span class="nf">load_byte</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">legacy_api</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span> <span class="k">return</span> <span class="n">data</span></div> <div class="viewcode-block" id="ImageFileDirectory_v2.write_byte"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2.write_byte">[docs]</a> <span class="nd">@_register_writer</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># Basic type, except for the legacy API.</span> <span class="k">def</span> <span class="nf">write_byte</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span> <span class="k">return</span> <span class="n">data</span></div> <div class="viewcode-block" id="ImageFileDirectory_v2.load_string"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2.load_string">[docs]</a> <span class="nd">@_register_loader</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="k">def</span> <span class="nf">load_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">legacy_api</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span> <span class="k">if</span> <span class="n">data</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="sa">b</span><span class="s2">"</span><span class="se">\0</span><span class="s2">"</span><span class="p">):</span> <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">return</span> <span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"latin-1"</span><span class="p">,</span> <span class="s2">"replace"</span><span class="p">)</span></div> <div class="viewcode-block" id="ImageFileDirectory_v2.write_string"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2.write_string">[docs]</a> <span class="nd">@_register_writer</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="k">def</span> <span class="nf">write_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="c1"># remerge of https://github.com/python-pillow/Pillow/pull/1416</span> <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="o">.</span><span class="n">major</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">'ascii'</span><span class="p">,</span> <span class="s1">'replace'</span><span class="p">)</span> <span class="k">return</span> <span class="sa">b</span><span class="s2">""</span> <span class="o">+</span> <span class="n">value</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">'ascii'</span><span class="p">,</span> <span class="s1">'replace'</span><span class="p">)</span> <span class="o">+</span> <span class="sa">b</span><span class="s2">"</span><span class="se">\0</span><span class="s2">"</span></div> <div class="viewcode-block" id="ImageFileDirectory_v2.load_rational"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2.load_rational">[docs]</a> <span class="nd">@_register_loader</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">8</span><span class="p">)</span> <span class="k">def</span> <span class="nf">load_rational</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">legacy_api</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span> <span class="n">vals</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unpack</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2">L"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">//</span> <span class="mi">4</span><span class="p">),</span> <span class="n">data</span><span class="p">)</span> <span class="k">def</span> <span class="nf">combine</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span> <span class="k">return</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">if</span> <span class="n">legacy_api</span> <span class="k">else</span> <span class="n">IFDRational</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">combine</span><span class="p">(</span><span class="n">num</span><span class="p">,</span> <span class="n">denom</span><span class="p">)</span> <span class="k">for</span> <span class="n">num</span><span class="p">,</span> <span class="n">denom</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">vals</span><span class="p">[::</span><span class="mi">2</span><span class="p">],</span> <span class="n">vals</span><span class="p">[</span><span class="mi">1</span><span class="p">::</span><span class="mi">2</span><span class="p">]))</span></div> <div class="viewcode-block" id="ImageFileDirectory_v2.write_rational"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2.write_rational">[docs]</a> <span class="nd">@_register_writer</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="k">def</span> <span class="nf">write_rational</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">values</span><span class="p">):</span> <span class="k">return</span> <span class="sa">b</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_pack</span><span class="p">(</span><span class="s2">"2L"</span><span class="p">,</span> <span class="o">*</span><span class="n">_limit_rational</span><span class="p">(</span><span class="n">frac</span><span class="p">,</span> <span class="mi">2</span> <span class="o">**</span> <span class="mi">31</span><span class="p">))</span> <span class="k">for</span> <span class="n">frac</span> <span class="ow">in</span> <span class="n">values</span><span class="p">)</span></div> <div class="viewcode-block" id="ImageFileDirectory_v2.load_undefined"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2.load_undefined">[docs]</a> <span class="nd">@_register_loader</span><span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="k">def</span> <span class="nf">load_undefined</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">legacy_api</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span> <span class="k">return</span> <span class="n">data</span></div> <div class="viewcode-block" id="ImageFileDirectory_v2.write_undefined"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2.write_undefined">[docs]</a> <span class="nd">@_register_writer</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span> <span class="k">def</span> <span class="nf">write_undefined</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="k">return</span> <span class="n">value</span></div> <div class="viewcode-block" id="ImageFileDirectory_v2.load_signed_rational"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2.load_signed_rational">[docs]</a> <span class="nd">@_register_loader</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">8</span><span class="p">)</span> <span class="k">def</span> <span class="nf">load_signed_rational</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">legacy_api</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span> <span class="n">vals</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unpack</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2">l"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">//</span> <span class="mi">4</span><span class="p">),</span> <span class="n">data</span><span class="p">)</span> <span class="k">def</span> <span class="nf">combine</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span> <span class="k">return</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">if</span> <span class="n">legacy_api</span> <span class="k">else</span> <span class="n">IFDRational</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">combine</span><span class="p">(</span><span class="n">num</span><span class="p">,</span> <span class="n">denom</span><span class="p">)</span> <span class="k">for</span> <span class="n">num</span><span class="p">,</span> <span class="n">denom</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">vals</span><span class="p">[::</span><span class="mi">2</span><span class="p">],</span> <span class="n">vals</span><span class="p">[</span><span class="mi">1</span><span class="p">::</span><span class="mi">2</span><span class="p">]))</span></div> <div class="viewcode-block" id="ImageFileDirectory_v2.write_signed_rational"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2.write_signed_rational">[docs]</a> <span class="nd">@_register_writer</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="k">def</span> <span class="nf">write_signed_rational</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">values</span><span class="p">):</span> <span class="k">return</span> <span class="sa">b</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_pack</span><span class="p">(</span><span class="s2">"2L"</span><span class="p">,</span> <span class="o">*</span><span class="n">_limit_rational</span><span class="p">(</span><span class="n">frac</span><span class="p">,</span> <span class="mi">2</span> <span class="o">**</span> <span class="mi">30</span><span class="p">))</span> <span class="k">for</span> <span class="n">frac</span> <span class="ow">in</span> <span class="n">values</span><span class="p">)</span></div> <span class="k">def</span> <span class="nf">_ensure_read</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span> <span class="n">ret</span> <span class="o">=</span> <span class="n">fp</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">size</span><span class="p">)</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span> <span class="o">!=</span> <span class="n">size</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s2">"Corrupt EXIF data. "</span> <span class="o">+</span> <span class="s2">"Expecting to read </span><span class="si">%d</span><span class="s2"> bytes but only got </span><span class="si">%d</span><span class="s2">. "</span> <span class="o">%</span> <span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">ret</span><span class="p">)))</span> <span class="k">return</span> <span class="n">ret</span> <div class="viewcode-block" id="ImageFileDirectory_v2.load"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2.load">[docs]</a> <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fp</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">_offset</span> <span class="o">=</span> <span class="n">fp</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_unpack</span><span class="p">(</span><span class="s2">"H"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ensure_read</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="mi">2</span><span class="p">))[</span><span class="mi">0</span><span class="p">]):</span> <span class="n">tag</span><span class="p">,</span> <span class="n">typ</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unpack</span><span class="p">(</span><span class="s2">"HHL4s"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ensure_read</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="mi">12</span><span class="p">))</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="n">tagname</span> <span class="o">=</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">lookup</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span><span class="o">.</span><span class="n">name</span> <span class="n">typname</span> <span class="o">=</span> <span class="n">TYPES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">typ</span><span class="p">,</span> <span class="s2">"unknown"</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"tag: </span><span class="si">%s</span><span class="s2"> (</span><span class="si">%d</span><span class="s2">) - type: </span><span class="si">%s</span><span class="s2"> (</span><span class="si">%d</span><span class="s2">)"</span> <span class="o">%</span> <span class="p">(</span><span class="n">tagname</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">typname</span><span class="p">,</span> <span class="n">typ</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="s2">" "</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="n">unit_size</span><span class="p">,</span> <span class="n">handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_load_dispatch</span><span class="p">[</span><span class="n">typ</span><span class="p">]</span> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- unsupported type"</span><span class="p">,</span> <span class="n">typ</span><span class="p">)</span> <span class="k">continue</span> <span class="c1"># ignore unsupported type</span> <span class="n">size</span> <span class="o">=</span> <span class="n">count</span> <span class="o">*</span> <span class="n">unit_size</span> <span class="k">if</span> <span class="n">size</span> <span class="o">></span> <span class="mi">4</span><span class="p">:</span> <span class="n">here</span> <span class="o">=</span> <span class="n">fp</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="n">offset</span><span class="p">,</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unpack</span><span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"Tag Location: </span><span class="si">%s</span><span class="s2"> - Data Location: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">here</span><span class="p">,</span> <span class="n">offset</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="s2">" "</span><span class="p">)</span> <span class="n">fp</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">offset</span><span class="p">)</span> <span class="n">data</span> <span class="o">=</span> <span class="n">ImageFile</span><span class="o">.</span><span class="n">_safe_read</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span> <span class="n">fp</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">here</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="p">[:</span><span class="n">size</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">!=</span> <span class="n">size</span><span class="p">:</span> <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">"Possibly corrupt EXIF data. "</span> <span class="s2">"Expecting to read </span><span class="si">%d</span><span class="s2"> bytes but only got </span><span class="si">%d</span><span class="s2">."</span> <span class="s2">" Skipping tag </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="n">tag</span><span class="p">))</span> <span class="k">continue</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="p">:</span> <span class="k">continue</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tagdata</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">typ</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="k">if</span> <span class="n">size</span> <span class="o">></span> <span class="mi">32</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- value: <table: </span><span class="si">%d</span><span class="s2"> bytes>"</span> <span class="o">%</span> <span class="n">size</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- value:"</span><span class="p">,</span> <span class="bp">self</span><span class="p">[</span><span class="n">tag</span><span class="p">])</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span><span class="p">,</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unpack</span><span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ensure_read</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span> <span class="k">except</span> <span class="ne">IOError</span> <span class="k">as</span> <span class="n">msg</span><span class="p">:</span> <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="p">))</span> <span class="k">return</span></div> <div class="viewcode-block" id="ImageFileDirectory_v2.save"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v2.save">[docs]</a> <span class="k">def</span> <span class="nf">save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fp</span><span class="p">):</span> <span class="k">if</span> <span class="n">fp</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="c1"># skip TIFF header on subsequent pages</span> <span class="c1"># tiff header -- PIL always starts the first IFD at offset 8</span> <span class="n">fp</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_prefix</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pack</span><span class="p">(</span><span class="s2">"HL"</span><span class="p">,</span> <span class="mi">42</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span> <span class="c1"># FIXME What about tagdata?</span> <span class="n">fp</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_pack</span><span class="p">(</span><span class="s2">"H"</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_tags_v2</span><span class="p">)))</span> <span class="n">entries</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">fp</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_tags_v2</span><span class="p">)</span> <span class="o">*</span> <span class="mi">12</span> <span class="o">+</span> <span class="mi">4</span> <span class="n">stripoffsets</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># pass 1: convert tags to binary format</span> <span class="c1"># always write tags in ascending order</span> <span class="k">for</span> <span class="n">tag</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_tags_v2</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span> <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">STRIPOFFSETS</span><span class="p">:</span> <span class="n">stripoffsets</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">entries</span><span class="p">)</span> <span class="n">typ</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"Tag </span><span class="si">%s</span><span class="s2">, Type: </span><span class="si">%s</span><span class="s2">, Value: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="n">typ</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span> <span class="n">values</span> <span class="o">=</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)</span> <span class="k">else</span> <span class="p">(</span><span class="n">value</span><span class="p">,)</span> <span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_write_dispatch</span><span class="p">[</span><span class="n">typ</span><span class="p">](</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">values</span><span class="p">)</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="n">tagname</span> <span class="o">=</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">lookup</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span><span class="o">.</span><span class="n">name</span> <span class="n">typname</span> <span class="o">=</span> <span class="n">TYPES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">typ</span><span class="p">,</span> <span class="s2">"unknown"</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"save: </span><span class="si">%s</span><span class="s2"> (</span><span class="si">%d</span><span class="s2">) - type: </span><span class="si">%s</span><span class="s2"> (</span><span class="si">%d</span><span class="s2">)"</span> <span class="o">%</span> <span class="p">(</span><span class="n">tagname</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">typname</span><span class="p">,</span> <span class="n">typ</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="s2">" "</span><span class="p">)</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">16</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- value: <table: </span><span class="si">%d</span><span class="s2"> bytes>"</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- value:"</span><span class="p">,</span> <span class="n">values</span><span class="p">)</span> <span class="c1"># count is sum of lengths for string and arbitrary data</span> <span class="k">if</span> <span class="n">typ</span> <span class="ow">in</span> <span class="p">[</span><span class="n">TiffTags</span><span class="o">.</span><span class="n">ASCII</span><span class="p">,</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">UNDEFINED</span><span class="p">]:</span> <span class="n">count</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">count</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">values</span><span class="p">)</span> <span class="c1"># figure out if data fits into the entry</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o"><=</span> <span class="mi">4</span><span class="p">:</span> <span class="n">entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">tag</span><span class="p">,</span> <span class="n">typ</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">ljust</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="sa">b</span><span class="s2">"</span><span class="se">\0</span><span class="s2">"</span><span class="p">),</span> <span class="sa">b</span><span class="s2">""</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="n">entries</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">tag</span><span class="p">,</span> <span class="n">typ</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pack</span><span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="n">offset</span><span class="p">),</span> <span class="n">data</span><span class="p">))</span> <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span> <span class="o">*</span> <span class="mi">2</span> <span class="c1"># pad to word</span> <span class="c1"># update strip offset data to point beyond auxiliary data</span> <span class="k">if</span> <span class="n">stripoffsets</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">tag</span><span class="p">,</span> <span class="n">typ</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">entries</span><span class="p">[</span><span class="n">stripoffsets</span><span class="p">]</span> <span class="k">if</span> <span class="n">data</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span> <span class="s2">"multistrip support not yet implemented"</span><span class="p">)</span> <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pack</span><span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unpack</span><span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="n">value</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">offset</span><span class="p">)</span> <span class="n">entries</span><span class="p">[</span><span class="n">stripoffsets</span><span class="p">]</span> <span class="o">=</span> <span class="n">tag</span><span class="p">,</span> <span class="n">typ</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">data</span> <span class="c1"># pass 2: write entries to file</span> <span class="k">for</span> <span class="n">tag</span><span class="p">,</span> <span class="n">typ</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">data</span> <span class="ow">in</span> <span class="n">entries</span><span class="p">:</span> <span class="k">if</span> <span class="n">DEBUG</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="n">typ</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="nb">repr</span><span class="p">(</span><span class="n">data</span><span class="p">))</span> <span class="n">fp</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_pack</span><span class="p">(</span><span class="s2">"HHL4s"</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">typ</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span> <span class="c1"># -- overwrite here for multi-page --</span> <span class="n">fp</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">b</span><span class="s2">"</span><span class="se">\0\0\0\0</span><span class="s2">"</span><span class="p">)</span> <span class="c1"># end of entries</span> <span class="c1"># pass 3: write auxiliary data to file</span> <span class="k">for</span> <span class="n">tag</span><span class="p">,</span> <span class="n">typ</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">data</span> <span class="ow">in</span> <span class="n">entries</span><span class="p">:</span> <span class="n">fp</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">&</span> <span class="mi">1</span><span class="p">:</span> <span class="n">fp</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">b</span><span class="s2">"</span><span class="se">\0</span><span class="s2">"</span><span class="p">)</span> <span class="k">return</span> <span class="n">offset</span></div></div> <span class="n">ImageFileDirectory_v2</span><span class="o">.</span><span class="n">_load_dispatch</span> <span class="o">=</span> <span class="n">_load_dispatch</span> <span class="n">ImageFileDirectory_v2</span><span class="o">.</span><span class="n">_write_dispatch</span> <span class="o">=</span> <span class="n">_write_dispatch</span> <span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">TYPES</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">" "</span><span class="p">,</span> <span class="s2">"_"</span><span class="p">)</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">ImageFileDirectory_v2</span><span class="p">,</span> <span class="s2">"load_"</span> <span class="o">+</span> <span class="n">name</span><span class="p">,</span> <span class="n">_load_dispatch</span><span class="p">[</span><span class="n">idx</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">ImageFileDirectory_v2</span><span class="p">,</span> <span class="s2">"write_"</span> <span class="o">+</span> <span class="n">name</span><span class="p">,</span> <span class="n">_write_dispatch</span><span class="p">[</span><span class="n">idx</span><span class="p">])</span> <span class="k">del</span> <span class="n">_load_dispatch</span><span class="p">,</span> <span class="n">_write_dispatch</span><span class="p">,</span> <span class="n">idx</span><span class="p">,</span> <span class="n">name</span> <span class="c1"># Legacy ImageFileDirectory support.</span> <div class="viewcode-block" id="ImageFileDirectory_v1"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v1">[docs]</a><span class="k">class</span> <span class="nc">ImageFileDirectory_v1</span><span class="p">(</span><span class="n">ImageFileDirectory_v2</span><span class="p">):</span> <span class="sd">"""This class represents the **legacy** interface to a TIFF tag directory.</span> <span class="sd"> Exposes a dictionary interface of the tags in the directory::</span> <span class="sd"> ifd = ImageFileDirectory_v1()</span> <span class="sd"> ifd[key] = 'Some Data'</span> <span class="sd"> ifd.tagtype[key] = 2</span> <span class="sd"> print(ifd[key])</span> <span class="sd"> ('Some Data',)</span> <span class="sd"> Also contains a dictionary of tag types as read from the tiff image file,</span> <span class="sd"> `~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`.</span> <span class="sd"> Values are returned as a tuple.</span> <span class="sd"> .. deprecated:: 3.0.0</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">ImageFileDirectory_v2</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_legacy_api</span> <span class="o">=</span> <span class="kc">True</span> <span class="n">tags</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tags_v1</span><span class="p">)</span> <span class="n">tagdata</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tagdata</span><span class="p">)</span> <div class="viewcode-block" id="ImageFileDirectory_v1.from_v2"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v1.from_v2">[docs]</a> <span class="nd">@classmethod</span> <span class="k">def</span> <span class="nf">from_v2</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">original</span><span class="p">):</span> <span class="sd">""" Returns an</span> <span class="sd"> :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`</span> <span class="sd"> instance with the same data as is contained in the original</span> <span class="sd"> :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`</span> <span class="sd"> instance.</span> <span class="sd"> :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`</span> <span class="sd"> """</span> <span class="n">ifd</span> <span class="o">=</span> <span class="bp">cls</span><span class="p">(</span><span class="n">prefix</span><span class="o">=</span><span class="n">original</span><span class="o">.</span><span class="n">prefix</span><span class="p">)</span> <span class="n">ifd</span><span class="o">.</span><span class="n">_tagdata</span> <span class="o">=</span> <span class="n">original</span><span class="o">.</span><span class="n">_tagdata</span> <span class="n">ifd</span><span class="o">.</span><span class="n">tagtype</span> <span class="o">=</span> <span class="n">original</span><span class="o">.</span><span class="n">tagtype</span> <span class="n">ifd</span><span class="o">.</span><span class="n">next</span> <span class="o">=</span> <span class="n">original</span><span class="o">.</span><span class="n">next</span> <span class="c1"># an indicator for multipage tiffs</span> <span class="k">return</span> <span class="n">ifd</span></div> <div class="viewcode-block" id="ImageFileDirectory_v1.to_v2"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.ImageFileDirectory_v1.to_v2">[docs]</a> <span class="k">def</span> <span class="nf">to_v2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" Returns an</span> <span class="sd"> :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`</span> <span class="sd"> instance with the same data as is contained in the original</span> <span class="sd"> :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`</span> <span class="sd"> instance.</span> <span class="sd"> :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`</span> <span class="sd"> """</span> <span class="n">ifd</span> <span class="o">=</span> <span class="n">ImageFileDirectory_v2</span><span class="p">(</span><span class="n">prefix</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">prefix</span><span class="p">)</span> <span class="n">ifd</span><span class="o">.</span><span class="n">_tagdata</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_tagdata</span><span class="p">)</span> <span class="n">ifd</span><span class="o">.</span><span class="n">tagtype</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">)</span> <span class="n">ifd</span><span class="o">.</span><span class="n">_tags_v2</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_tags_v2</span><span class="p">)</span> <span class="k">return</span> <span class="n">ifd</span></div> <span class="k">def</span> <span class="nf">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">):</span> <span class="k">return</span> <span class="n">tag</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tags_v1</span> <span class="ow">or</span> <span class="n">tag</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tagdata</span> <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_tagdata</span><span class="p">)</span> <span class="o">|</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_tags_v1</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_tagdata</span><span class="p">)</span> <span class="o">|</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_tags_v1</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="k">for</span> <span class="n">legacy_api</span> <span class="ow">in</span> <span class="p">(</span><span class="kc">False</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setitem</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">legacy_api</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">):</span> <span class="k">if</span> <span class="n">tag</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tags_v1</span><span class="p">:</span> <span class="c1"># unpack on the fly</span> <span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tagdata</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="n">typ</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="n">size</span><span class="p">,</span> <span class="n">handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_load_dispatch</span><span class="p">[</span><span class="n">typ</span><span class="p">]</span> <span class="k">for</span> <span class="n">legacy</span> <span class="ow">in</span> <span class="p">(</span><span class="kc">False</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setitem</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="n">handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">legacy</span><span class="p">),</span> <span class="n">legacy</span><span class="p">)</span> <span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tags_v1</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">)):</span> <span class="n">val</span> <span class="o">=</span> <span class="n">val</span><span class="p">,</span> <span class="k">return</span> <span class="n">val</span></div> <span class="c1"># undone -- switch this pointer when IFD_LEGACY_API == False</span> <span class="n">ImageFileDirectory</span> <span class="o">=</span> <span class="n">ImageFileDirectory_v1</span> <span class="c1">##</span> <span class="c1"># Image plugin for TIFF files.</span> <div class="viewcode-block" id="TiffImageFile"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.TiffImageFile">[docs]</a><span class="k">class</span> <span class="nc">TiffImageFile</span><span class="p">(</span><span class="n">ImageFile</span><span class="o">.</span><span class="n">ImageFile</span><span class="p">):</span> <span class="nb">format</span> <span class="o">=</span> <span class="s2">"TIFF"</span> <span class="n">format_description</span> <span class="o">=</span> <span class="s2">"Adobe TIFF"</span> <span class="n">_close_exclusive_fp_after_loading</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">def</span> <span class="nf">_open</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="s2">"Open the first image in a TIFF file"</span> <span class="c1"># Header</span> <span class="n">ifh</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span> <span class="c1"># image file directory (tag dictionary)</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span> <span class="o">=</span> <span class="n">ImageFileDirectory_v2</span><span class="p">(</span><span class="n">ifh</span><span class="p">)</span> <span class="c1"># legacy tag/ifd entries will be filled in later</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ifd</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># setup frame pointers</span> <span class="bp">self</span><span class="o">.</span><span class="n">__first</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__next</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">next</span> <span class="bp">self</span><span class="o">.</span><span class="n">__frame</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fp</span> <span class="bp">self</span><span class="o">.</span><span class="n">_frame_pos</span> <span class="o">=</span> <span class="p">[]</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n_frames</span> <span class="o">=</span> <span class="kc">None</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_animated</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"*** TiffImageFile._open ***"</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- __first:"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__first</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- ifh: "</span><span class="p">,</span> <span class="n">ifh</span><span class="p">)</span> <span class="c1"># and load the first frame</span> <span class="bp">self</span><span class="o">.</span><span class="n">_seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">n_frames</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n_frames</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">current</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_seek</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="k">except</span> <span class="ne">EOFError</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n_frames</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="o">+</span> <span class="mi">1</span> <span class="bp">self</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">current</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n_frames</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">is_animated</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_animated</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n_frames</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_animated</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n_frames</span> <span class="o">!=</span> <span class="mi">1</span> <span class="k">else</span><span class="p">:</span> <span class="n">current</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_animated</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">except</span> <span class="ne">EOFError</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_animated</span> <span class="o">=</span> <span class="kc">False</span> <span class="bp">self</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">current</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_animated</span> <div class="viewcode-block" id="TiffImageFile.seek"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.TiffImageFile.seek">[docs]</a> <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">frame</span><span class="p">):</span> <span class="s2">"Select a given frame as current image"</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_seek_check</span><span class="p">(</span><span class="n">frame</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_seek</span><span class="p">(</span><span class="n">frame</span><span class="p">)</span> <span class="c1"># Create a new core image object on second and</span> <span class="c1"># subsequent frames in the image. Image may be</span> <span class="c1"># different size/mode.</span> <span class="n">Image</span><span class="o">.</span><span class="n">_decompression_bomb_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">im</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">)</span></div> <span class="k">def</span> <span class="nf">_seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">frame</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">fp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fp</span> <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_frame_pos</span><span class="p">)</span> <span class="o"><=</span> <span class="n">frame</span><span class="p">:</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__next</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">EOFError</span><span class="p">(</span><span class="s2">"no more images in TIFF file"</span><span class="p">)</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"Seeking to frame </span><span class="si">%s</span><span class="s2">, on frame </span><span class="si">%s</span><span class="s2">, "</span> <span class="s2">"__next </span><span class="si">%s</span><span class="s2">, location: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">frame</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__frame</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__next</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="o">.</span><span class="n">tell</span><span class="p">()))</span> <span class="c1"># reset python3 buffered io handle in case fp</span> <span class="c1"># was passed to libtiff, invalidating the buffer</span> <span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__next</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_frame_pos</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__next</span><span class="p">)</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"Loading tags, location: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="o">.</span><span class="n">tell</span><span class="p">())</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">__next</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">next</span> <span class="bp">self</span><span class="o">.</span><span class="n">__frame</span> <span class="o">+=</span> <span class="mi">1</span> <span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_frame_pos</span><span class="p">[</span><span class="n">frame</span><span class="p">])</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">__next</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">next</span> <span class="c1"># fill the legacy tag/ifd entries</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ifd</span> <span class="o">=</span> <span class="n">ImageFileDirectory_v1</span><span class="o">.</span><span class="n">from_v2</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">__frame</span> <span class="o">=</span> <span class="n">frame</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setup</span><span class="p">()</span> <div class="viewcode-block" id="TiffImageFile.tell"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.TiffImageFile.tell">[docs]</a> <span class="k">def</span> <span class="nf">tell</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="s2">"Return the current frame number"</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__frame</span></div> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">size</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_size</span> <span class="nd">@size</span><span class="o">.</span><span class="n">setter</span> <span class="k">def</span> <span class="nf">size</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span> <span class="s1">'Setting the size of a TIFF image directly is deprecated, and will'</span> <span class="s1">' be removed in a future version. Use the resize method instead.'</span><span class="p">,</span> <span class="ne">DeprecationWarning</span> <span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_size</span> <span class="o">=</span> <span class="n">value</span> <div class="viewcode-block" id="TiffImageFile.load"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.TiffImageFile.load">[docs]</a> <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">use_load_libtiff</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_load_libtiff</span><span class="p">()</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">TiffImageFile</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">load</span><span class="p">()</span></div> <div class="viewcode-block" id="TiffImageFile.load_end"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.TiffImageFile.load_end">[docs]</a> <span class="k">def</span> <span class="nf">load_end</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># allow closing if we're on the first frame, there's no next</span> <span class="c1"># This is the ImageFile.load path only, libtiff specific below.</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__frame</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__next</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_close_exclusive_fp_after_loading</span> <span class="o">=</span> <span class="kc">True</span></div> <span class="k">def</span> <span class="nf">_load_libtiff</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" Overload method triggered when we detect a compressed tiff</span> <span class="sd"> Calls out to libtiff """</span> <span class="n">pixel</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">Image</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">tile</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s2">"cannot load this image"</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">tile</span><span class="p">:</span> <span class="k">return</span> <span class="n">pixel</span> <span class="bp">self</span><span class="o">.</span><span class="n">load_prepare</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tile</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s2">"Not exactly one tile"</span><span class="p">)</span> <span class="c1"># (self._compression, (extents tuple),</span> <span class="c1"># 0, (rawmode, self._compression, fp))</span> <span class="n">extents</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tile</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="n">args</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tile</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">3</span><span class="p">])</span> <span class="o">+</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">offset</span><span class="p">]</span> <span class="c1"># To be nice on memory footprint, if there's a</span> <span class="c1"># file descriptor, use that instead of reading</span> <span class="c1"># into a string in python.</span> <span class="c1"># libtiff closes the file descriptor, so pass in a dup.</span> <span class="k">try</span><span class="p">:</span> <span class="n">fp</span> <span class="o">=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="p">,</span> <span class="s2">"fileno"</span><span class="p">)</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">dup</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="o">.</span><span class="n">fileno</span><span class="p">())</span> <span class="c1"># flush the file descriptor, prevents error on pypy 2.4+</span> <span class="c1"># should also eliminate the need for fp.tell for py3</span> <span class="c1"># in _seek</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="p">,</span> <span class="s2">"flush"</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span> <span class="k">except</span> <span class="ne">IOError</span><span class="p">:</span> <span class="c1"># io.BytesIO have a fileno, but returns an IOError if</span> <span class="c1"># it doesn't use a file descriptor.</span> <span class="n">fp</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">if</span> <span class="n">fp</span><span class="p">:</span> <span class="n">args</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">fp</span> <span class="n">decoder</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">_getdecoder</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mode</span><span class="p">,</span> <span class="s1">'libtiff'</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">args</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">decoderconfig</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="n">decoder</span><span class="o">.</span><span class="n">setimage</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">im</span><span class="p">,</span> <span class="n">extents</span><span class="p">)</span> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s2">"Couldn't set the image"</span><span class="p">)</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="p">,</span> <span class="s2">"getvalue"</span><span class="p">):</span> <span class="c1"># We've got a stringio like thing passed in. Yay for all in memory.</span> <span class="c1"># The decoder needs the entire file in one shot, so there's not</span> <span class="c1"># a lot we can do here other than give it the entire file.</span> <span class="c1"># unless we could do something like get the address of the</span> <span class="c1"># underlying string for stringio.</span> <span class="c1">#</span> <span class="c1"># Rearranging for supporting byteio items, since they have a fileno</span> <span class="c1"># that returns an IOError if there's no underlying fp. Easier to</span> <span class="c1"># deal with here by reordering.</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"have getvalue. just sending in a string from getvalue"</span><span class="p">)</span> <span class="n">n</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">decoder</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="o">.</span><span class="n">getvalue</span><span class="p">())</span> <span class="k">elif</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="p">,</span> <span class="s2">"fileno"</span><span class="p">):</span> <span class="c1"># we've got a actual file on disk, pass in the fp.</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"have fileno, calling fileno version of the decoder."</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="c1"># 4 bytes, otherwise the trace might error out</span> <span class="n">n</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">decoder</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="sa">b</span><span class="s2">"fpfp"</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># we have something else.</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"don't have fileno or getvalue. just reading"</span><span class="p">)</span> <span class="c1"># UNDONE -- so much for that buffer size thing.</span> <span class="n">n</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">decoder</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="o">.</span><span class="n">read</span><span class="p">())</span> <span class="bp">self</span><span class="o">.</span><span class="n">tile</span> <span class="o">=</span> <span class="p">[]</span> <span class="bp">self</span><span class="o">.</span><span class="n">readonly</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># libtiff closed the fp in a, we need to close self.fp, if possible</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exclusive_fp</span><span class="p">:</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__frame</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__next</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">fp</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># might be shared</span> <span class="k">if</span> <span class="n">err</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="n">err</span><span class="p">)</span> <span class="k">return</span> <span class="n">Image</span><span class="o">.</span><span class="n">Image</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="s2">"Setup this image object based on current tags"</span> <span class="k">if</span> <span class="mh">0xBC01</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s2">"Windows Media Photo files not yet supported"</span><span class="p">)</span> <span class="c1"># extract relevant tags</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compression</span> <span class="o">=</span> <span class="n">COMPRESSION_INFO</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">COMPRESSION</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span> <span class="bp">self</span><span class="o">.</span><span class="n">_planar_configuration</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">PLANAR_CONFIGURATION</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="c1"># photometric is a required tag, but not everyone is reading</span> <span class="c1"># the specification</span> <span class="n">photo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">PHOTOMETRIC_INTERPRETATION</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="n">fillorder</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">FILLORDER</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"*** Summary ***"</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- compression:"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compression</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- photometric_interpretation:"</span><span class="p">,</span> <span class="n">photo</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- planar_configuration:"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_planar_configuration</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- fill_order:"</span><span class="p">,</span> <span class="n">fillorder</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- YCbCr subsampling:"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="mi">530</span><span class="p">))</span> <span class="c1"># size</span> <span class="n">xsize</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">IMAGEWIDTH</span><span class="p">))</span> <span class="n">ysize</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">IMAGELENGTH</span><span class="p">))</span> <span class="bp">self</span><span class="o">.</span><span class="n">_size</span> <span class="o">=</span> <span class="n">xsize</span><span class="p">,</span> <span class="n">ysize</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- size:"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">)</span> <span class="n">sampleFormat</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">SAMPLEFORMAT</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,))</span> <span class="k">if</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">sampleFormat</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span> <span class="ow">and</span> <span class="nb">max</span><span class="p">(</span><span class="n">sampleFormat</span><span class="p">)</span> <span class="o">==</span> <span class="nb">min</span><span class="p">(</span><span class="n">sampleFormat</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span> <span class="c1"># SAMPLEFORMAT is properly per band, so an RGB image will</span> <span class="c1"># be (1,1,1). But, we don't support per band pixel types,</span> <span class="c1"># and anything more than one band is a uint8. So, just</span> <span class="c1"># take the first element. Revisit this if adding support</span> <span class="c1"># for more exotic images.</span> <span class="n">sampleFormat</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,)</span> <span class="n">bps_tuple</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">BITSPERSAMPLE</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,))</span> <span class="n">extra_tuple</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">EXTRASAMPLES</span><span class="p">,</span> <span class="p">())</span> <span class="k">if</span> <span class="n">photo</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">8</span><span class="p">):</span> <span class="c1"># RGB, YCbCr, LAB</span> <span class="n">bps_count</span> <span class="o">=</span> <span class="mi">3</span> <span class="k">elif</span> <span class="n">photo</span> <span class="o">==</span> <span class="mi">5</span><span class="p">:</span> <span class="c1"># CMYK</span> <span class="n">bps_count</span> <span class="o">=</span> <span class="mi">4</span> <span class="k">else</span><span class="p">:</span> <span class="n">bps_count</span> <span class="o">=</span> <span class="mi">1</span> <span class="n">bps_count</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">extra_tuple</span><span class="p">)</span> <span class="c1"># Some files have only one value in bps_tuple,</span> <span class="c1"># while should have more. Fix it</span> <span class="k">if</span> <span class="n">bps_count</span> <span class="o">></span> <span class="nb">len</span><span class="p">(</span><span class="n">bps_tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">bps_tuple</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">bps_tuple</span> <span class="o">=</span> <span class="n">bps_tuple</span> <span class="o">*</span> <span class="n">bps_count</span> <span class="c1"># mode: check photometric interpretation and bits per pixel</span> <span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">prefix</span><span class="p">,</span> <span class="n">photo</span><span class="p">,</span> <span class="n">sampleFormat</span><span class="p">,</span> <span class="n">fillorder</span><span class="p">,</span> <span class="n">bps_tuple</span><span class="p">,</span> <span class="n">extra_tuple</span><span class="p">)</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"format key:"</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">mode</span><span class="p">,</span> <span class="n">rawmode</span> <span class="o">=</span> <span class="n">OPEN_INFO</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- unsupported format"</span><span class="p">)</span> <span class="k">raise</span> <span class="ne">SyntaxError</span><span class="p">(</span><span class="s2">"unknown pixel mode"</span><span class="p">)</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- raw mode:"</span><span class="p">,</span> <span class="n">rawmode</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- pil mode:"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">mode</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">[</span><span class="s2">"compression"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compression</span> <span class="n">xres</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">X_RESOLUTION</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="n">yres</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">Y_RESOLUTION</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="k">if</span> <span class="n">xres</span> <span class="ow">and</span> <span class="n">yres</span><span class="p">:</span> <span class="n">resunit</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">RESOLUTION_UNIT</span><span class="p">)</span> <span class="k">if</span> <span class="n">resunit</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="c1"># dots per inch</span> <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">[</span><span class="s2">"dpi"</span><span class="p">]</span> <span class="o">=</span> <span class="n">xres</span><span class="p">,</span> <span class="n">yres</span> <span class="k">elif</span> <span class="n">resunit</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span> <span class="c1"># dots per centimeter. convert to dpi</span> <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">[</span><span class="s2">"dpi"</span><span class="p">]</span> <span class="o">=</span> <span class="n">xres</span> <span class="o">*</span> <span class="mf">2.54</span><span class="p">,</span> <span class="n">yres</span> <span class="o">*</span> <span class="mf">2.54</span> <span class="k">elif</span> <span class="n">resunit</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># used to default to 1, but now 2)</span> <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">[</span><span class="s2">"dpi"</span><span class="p">]</span> <span class="o">=</span> <span class="n">xres</span><span class="p">,</span> <span class="n">yres</span> <span class="c1"># For backward compatibility,</span> <span class="c1"># we also preserve the old behavior</span> <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">[</span><span class="s2">"resolution"</span><span class="p">]</span> <span class="o">=</span> <span class="n">xres</span><span class="p">,</span> <span class="n">yres</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># No absolute unit of measurement</span> <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">[</span><span class="s2">"resolution"</span><span class="p">]</span> <span class="o">=</span> <span class="n">xres</span><span class="p">,</span> <span class="n">yres</span> <span class="c1"># build tile descriptors</span> <span class="n">x</span> <span class="o">=</span> <span class="n">y</span> <span class="o">=</span> <span class="n">layer</span> <span class="o">=</span> <span class="mi">0</span> <span class="bp">self</span><span class="o">.</span><span class="n">tile</span> <span class="o">=</span> <span class="p">[]</span> <span class="bp">self</span><span class="o">.</span><span class="n">use_load_libtiff</span> <span class="o">=</span> <span class="n">READ_LIBTIFF</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compression</span> <span class="o">!=</span> <span class="s1">'raw'</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">use_load_libtiff</span><span class="p">:</span> <span class="c1"># Decoder expects entire file as one tile.</span> <span class="c1"># There's a buffer size limit in load (64k)</span> <span class="c1"># so large g4 images will fail if we use that</span> <span class="c1"># function.</span> <span class="c1">#</span> <span class="c1"># Setup the one tile for the whole image, then</span> <span class="c1"># use the _load_libtiff function.</span> <span class="c1"># libtiff handles the fillmode for us, so 1;IR should</span> <span class="c1"># actually be 1;I. Including the R double reverses the</span> <span class="c1"># bits, so stripes of the image are reversed. See</span> <span class="c1"># https://github.com/python-pillow/Pillow/issues/279</span> <span class="k">if</span> <span class="n">fillorder</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="c1"># Replace fillorder with fillorder=1</span> <span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="mi">1</span><span class="p">,)</span> <span class="o">+</span> <span class="n">key</span><span class="p">[</span><span class="mi">4</span><span class="p">:]</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"format key:"</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> <span class="c1"># this should always work, since all the</span> <span class="c1"># fillorder==2 modes have a corresponding</span> <span class="c1"># fillorder=1 mode</span> <span class="bp">self</span><span class="o">.</span><span class="n">mode</span><span class="p">,</span> <span class="n">rawmode</span> <span class="o">=</span> <span class="n">OPEN_INFO</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="c1"># libtiff always returns the bytes in native order.</span> <span class="c1"># we're expecting image byte order. So, if the rawmode</span> <span class="c1"># contains I;16, we need to convert from native to image</span> <span class="c1"># byte order.</span> <span class="k">if</span> <span class="n">rawmode</span> <span class="o">==</span> <span class="s1">'I;16'</span><span class="p">:</span> <span class="n">rawmode</span> <span class="o">=</span> <span class="s1">'I;16N'</span> <span class="k">if</span> <span class="s1">';16B'</span> <span class="ow">in</span> <span class="n">rawmode</span><span class="p">:</span> <span class="n">rawmode</span> <span class="o">=</span> <span class="n">rawmode</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">';16B'</span><span class="p">,</span> <span class="s1">';16N'</span><span class="p">)</span> <span class="k">if</span> <span class="s1">';16L'</span> <span class="ow">in</span> <span class="n">rawmode</span><span class="p">:</span> <span class="n">rawmode</span> <span class="o">=</span> <span class="n">rawmode</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">';16L'</span><span class="p">,</span> <span class="s1">';16N'</span><span class="p">)</span> <span class="c1"># Offset in the tile tuple is 0, we go from 0,0 to</span> <span class="c1"># w,h, and we only do this once -- eds</span> <span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="n">rawmode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compression</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">tile</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_compression</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">xsize</span><span class="p">,</span> <span class="n">ysize</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="n">a</span><span class="p">))</span> <span class="k">elif</span> <span class="n">STRIPOFFSETS</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span> <span class="ow">or</span> <span class="n">TILEOFFSETS</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="p">:</span> <span class="c1"># striped image</span> <span class="k">if</span> <span class="n">STRIPOFFSETS</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="p">:</span> <span class="n">offsets</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="p">[</span><span class="n">STRIPOFFSETS</span><span class="p">]</span> <span class="n">h</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ROWSPERSTRIP</span><span class="p">,</span> <span class="n">ysize</span><span class="p">)</span> <span class="n">w</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># tiled image</span> <span class="n">offsets</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="p">[</span><span class="n">TILEOFFSETS</span><span class="p">]</span> <span class="n">w</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="mi">322</span><span class="p">)</span> <span class="n">h</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="mi">323</span><span class="p">)</span> <span class="k">for</span> <span class="n">offset</span> <span class="ow">in</span> <span class="n">offsets</span><span class="p">:</span> <span class="k">if</span> <span class="n">x</span> <span class="o">+</span> <span class="n">w</span> <span class="o">></span> <span class="n">xsize</span><span class="p">:</span> <span class="n">stride</span> <span class="o">=</span> <span class="n">w</span> <span class="o">*</span> <span class="nb">sum</span><span class="p">(</span><span class="n">bps_tuple</span><span class="p">)</span> <span class="o">/</span> <span class="mi">8</span> <span class="c1"># bytes per line</span> <span class="k">else</span><span class="p">:</span> <span class="n">stride</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">tile_rawmode</span> <span class="o">=</span> <span class="n">rawmode</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_planar_configuration</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="c1"># each band on it's own layer</span> <span class="n">tile_rawmode</span> <span class="o">=</span> <span class="n">rawmode</span><span class="p">[</span><span class="n">layer</span><span class="p">]</span> <span class="c1"># adjust stride width accordingly</span> <span class="n">stride</span> <span class="o">/=</span> <span class="n">bps_count</span> <span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="n">tile_rawmode</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">stride</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">tile</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_compression</span><span class="p">,</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="nb">min</span><span class="p">(</span><span class="n">x</span><span class="o">+</span><span class="n">w</span><span class="p">,</span> <span class="n">xsize</span><span class="p">),</span> <span class="nb">min</span><span class="p">(</span><span class="n">y</span><span class="o">+</span><span class="n">h</span><span class="p">,</span> <span class="n">ysize</span><span class="p">)),</span> <span class="n">offset</span><span class="p">,</span> <span class="n">a</span><span class="p">))</span> <span class="n">x</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="n">w</span> <span class="k">if</span> <span class="n">x</span> <span class="o">>=</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="n">h</span> <span class="k">if</span> <span class="n">y</span> <span class="o">>=</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span> <span class="n">x</span> <span class="o">=</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">layer</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"- unsupported data organization"</span><span class="p">)</span> <span class="k">raise</span> <span class="ne">SyntaxError</span><span class="p">(</span><span class="s2">"unknown data organization"</span><span class="p">)</span> <span class="c1"># Fix up info.</span> <span class="k">if</span> <span class="n">ICCPROFILE</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">[</span><span class="s1">'icc_profile'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="p">[</span><span class="n">ICCPROFILE</span><span class="p">]</span> <span class="c1"># fixup palette descriptor</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mode</span> <span class="o">==</span> <span class="s2">"P"</span><span class="p">:</span> <span class="n">palette</span> <span class="o">=</span> <span class="p">[</span><span class="n">o8</span><span class="p">(</span><span class="n">b</span> <span class="o">//</span> <span class="mi">256</span><span class="p">)</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tag_v2</span><span class="p">[</span><span class="n">COLORMAP</span><span class="p">]]</span> <span class="bp">self</span><span class="o">.</span><span class="n">palette</span> <span class="o">=</span> <span class="n">ImagePalette</span><span class="o">.</span><span class="n">raw</span><span class="p">(</span><span class="s2">"RGB;L"</span><span class="p">,</span> <span class="sa">b</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">palette</span><span class="p">))</span> <span class="k">def</span> <span class="nf">_close__fp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fp</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fp</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fp</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">pass</span> <span class="k">finally</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fp</span> <span class="o">=</span> <span class="kc">None</span></div> <span class="c1">#</span> <span class="c1"># --------------------------------------------------------------------</span> <span class="c1"># Write TIFF files</span> <span class="c1"># little endian is default except for image modes with</span> <span class="c1"># explicit big endian byte-order</span> <span class="n">SAVE_INFO</span> <span class="o">=</span> <span class="p">{</span> <span class="c1"># mode => rawmode, byteorder, photometrics,</span> <span class="c1"># sampleformat, bitspersample, extra</span> <span class="s2">"1"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"1"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="kc">None</span><span class="p">),</span> <span class="s2">"L"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"L"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,),</span> <span class="kc">None</span><span class="p">),</span> <span class="s2">"LA"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"LA"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="mi">2</span><span class="p">),</span> <span class="s2">"P"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"P"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,),</span> <span class="kc">None</span><span class="p">),</span> <span class="s2">"PA"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"PA"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="mi">2</span><span class="p">),</span> <span class="s2">"I"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"I;32S"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">32</span><span class="p">,),</span> <span class="kc">None</span><span class="p">),</span> <span class="s2">"I;16"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"I;16"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,),</span> <span class="kc">None</span><span class="p">),</span> <span class="s2">"I;16S"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"I;16S"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,),</span> <span class="kc">None</span><span class="p">),</span> <span class="s2">"F"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"F;32F"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">32</span><span class="p">,),</span> <span class="kc">None</span><span class="p">),</span> <span class="s2">"RGB"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"RGB"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="kc">None</span><span class="p">),</span> <span class="s2">"RGBX"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"RGBX"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="mi">0</span><span class="p">),</span> <span class="s2">"RGBA"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"RGBA"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="mi">2</span><span class="p">),</span> <span class="s2">"CMYK"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"CMYK"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="kc">None</span><span class="p">),</span> <span class="s2">"YCbCr"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"YCbCr"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="kc">None</span><span class="p">),</span> <span class="s2">"LAB"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"LAB"</span><span class="p">,</span> <span class="n">II</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="kc">None</span><span class="p">),</span> <span class="s2">"I;32BS"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"I;32BS"</span><span class="p">,</span> <span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">32</span><span class="p">,),</span> <span class="kc">None</span><span class="p">),</span> <span class="s2">"I;16B"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"I;16B"</span><span class="p">,</span> <span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,),</span> <span class="kc">None</span><span class="p">),</span> <span class="s2">"I;16BS"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"I;16BS"</span><span class="p">,</span> <span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">16</span><span class="p">,),</span> <span class="kc">None</span><span class="p">),</span> <span class="s2">"F;32BF"</span><span class="p">:</span> <span class="p">(</span><span class="s2">"F;32BF"</span><span class="p">,</span> <span class="n">MM</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">32</span><span class="p">,),</span> <span class="kc">None</span><span class="p">),</span> <span class="p">}</span> <span class="k">def</span> <span class="nf">_save</span><span class="p">(</span><span class="n">im</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="n">rawmode</span><span class="p">,</span> <span class="n">prefix</span><span class="p">,</span> <span class="n">photo</span><span class="p">,</span> <span class="nb">format</span><span class="p">,</span> <span class="n">bits</span><span class="p">,</span> <span class="n">extra</span> <span class="o">=</span> <span class="n">SAVE_INFO</span><span class="p">[</span><span class="n">im</span><span class="o">.</span><span class="n">mode</span><span class="p">]</span> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s2">"cannot write mode </span><span class="si">%s</span><span class="s2"> as TIFF"</span> <span class="o">%</span> <span class="n">im</span><span class="o">.</span><span class="n">mode</span><span class="p">)</span> <span class="n">ifd</span> <span class="o">=</span> <span class="n">ImageFileDirectory_v2</span><span class="p">(</span><span class="n">prefix</span><span class="o">=</span><span class="n">prefix</span><span class="p">)</span> <span class="n">compression</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">encoderinfo</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'compression'</span><span class="p">,</span> <span class="n">im</span><span class="o">.</span><span class="n">info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'compression'</span><span class="p">))</span> <span class="k">if</span> <span class="n">compression</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">compression</span> <span class="o">=</span> <span class="s1">'raw'</span> <span class="n">libtiff</span> <span class="o">=</span> <span class="n">WRITE_LIBTIFF</span> <span class="ow">or</span> <span class="n">compression</span> <span class="o">!=</span> <span class="s1">'raw'</span> <span class="c1"># required for color libtiff images</span> <span class="n">ifd</span><span class="p">[</span><span class="n">PLANAR_CONFIGURATION</span><span class="p">]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">im</span><span class="p">,</span> <span class="s1">'_planar_configuration'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="n">ifd</span><span class="p">[</span><span class="n">IMAGEWIDTH</span><span class="p">]</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">ifd</span><span class="p">[</span><span class="n">IMAGELENGTH</span><span class="p">]</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="c1"># write any arbitrary tags passed in as an ImageFileDirectory</span> <span class="n">info</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">encoderinfo</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"tiffinfo"</span><span class="p">,</span> <span class="p">{})</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"Tiffinfo Keys: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="nb">list</span><span class="p">(</span><span class="n">info</span><span class="p">))</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">info</span><span class="p">,</span> <span class="n">ImageFileDirectory_v1</span><span class="p">):</span> <span class="n">info</span> <span class="o">=</span> <span class="n">info</span><span class="o">.</span><span class="n">to_v2</span><span class="p">()</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">info</span><span class="p">:</span> <span class="n">ifd</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="n">ifd</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">info</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <span class="k">pass</span> <span class="c1"># might not be an IFD, Might not have populated type</span> <span class="c1"># additions written by Greg Couch, gregc@cgl.ucsf.edu</span> <span class="c1"># inspired by image-sig posting from Kevin Cazabon, kcazabon@home.com</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">im</span><span class="p">,</span> <span class="s1">'tag_v2'</span><span class="p">):</span> <span class="c1"># preserve tags from original TIFF image file</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="n">RESOLUTION_UNIT</span><span class="p">,</span> <span class="n">X_RESOLUTION</span><span class="p">,</span> <span class="n">Y_RESOLUTION</span><span class="p">,</span> <span class="n">IPTC_NAA_CHUNK</span><span class="p">,</span> <span class="n">PHOTOSHOP_CHUNK</span><span class="p">,</span> <span class="n">XMP</span><span class="p">):</span> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">im</span><span class="o">.</span><span class="n">tag_v2</span><span class="p">:</span> <span class="n">ifd</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">tag_v2</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="n">ifd</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">tag_v2</span><span class="o">.</span><span class="n">tagtype</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="c1"># preserve ICC profile (should also work when saving other formats</span> <span class="c1"># which support profiles as TIFF) -- 2008-06-06 Florian Hoech</span> <span class="k">if</span> <span class="s2">"icc_profile"</span> <span class="ow">in</span> <span class="n">im</span><span class="o">.</span><span class="n">info</span><span class="p">:</span> <span class="n">ifd</span><span class="p">[</span><span class="n">ICCPROFILE</span><span class="p">]</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">info</span><span class="p">[</span><span class="s2">"icc_profile"</span><span class="p">]</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">name</span> <span class="ow">in</span> <span class="p">[(</span><span class="n">IMAGEDESCRIPTION</span><span class="p">,</span> <span class="s2">"description"</span><span class="p">),</span> <span class="p">(</span><span class="n">X_RESOLUTION</span><span class="p">,</span> <span class="s2">"resolution"</span><span class="p">),</span> <span class="p">(</span><span class="n">Y_RESOLUTION</span><span class="p">,</span> <span class="s2">"resolution"</span><span class="p">),</span> <span class="p">(</span><span class="n">X_RESOLUTION</span><span class="p">,</span> <span class="s2">"x_resolution"</span><span class="p">),</span> <span class="p">(</span><span class="n">Y_RESOLUTION</span><span class="p">,</span> <span class="s2">"y_resolution"</span><span class="p">),</span> <span class="p">(</span><span class="n">RESOLUTION_UNIT</span><span class="p">,</span> <span class="s2">"resolution_unit"</span><span class="p">),</span> <span class="p">(</span><span class="n">SOFTWARE</span><span class="p">,</span> <span class="s2">"software"</span><span class="p">),</span> <span class="p">(</span><span class="n">DATE_TIME</span><span class="p">,</span> <span class="s2">"date_time"</span><span class="p">),</span> <span class="p">(</span><span class="n">ARTIST</span><span class="p">,</span> <span class="s2">"artist"</span><span class="p">),</span> <span class="p">(</span><span class="n">COPYRIGHT</span><span class="p">,</span> <span class="s2">"copyright"</span><span class="p">)]:</span> <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">im</span><span class="o">.</span><span class="n">encoderinfo</span><span class="p">:</span> <span class="n">ifd</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">encoderinfo</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="n">dpi</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">encoderinfo</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"dpi"</span><span class="p">)</span> <span class="k">if</span> <span class="n">dpi</span><span class="p">:</span> <span class="n">ifd</span><span class="p">[</span><span class="n">RESOLUTION_UNIT</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span> <span class="n">ifd</span><span class="p">[</span><span class="n">X_RESOLUTION</span><span class="p">]</span> <span class="o">=</span> <span class="n">dpi</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">ifd</span><span class="p">[</span><span class="n">Y_RESOLUTION</span><span class="p">]</span> <span class="o">=</span> <span class="n">dpi</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="n">bits</span> <span class="o">!=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,):</span> <span class="n">ifd</span><span class="p">[</span><span class="n">BITSPERSAMPLE</span><span class="p">]</span> <span class="o">=</span> <span class="n">bits</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">bits</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span> <span class="n">ifd</span><span class="p">[</span><span class="n">SAMPLESPERPIXEL</span><span class="p">]</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">bits</span><span class="p">)</span> <span class="k">if</span> <span class="n">extra</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">ifd</span><span class="p">[</span><span class="n">EXTRASAMPLES</span><span class="p">]</span> <span class="o">=</span> <span class="n">extra</span> <span class="k">if</span> <span class="nb">format</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span> <span class="n">ifd</span><span class="p">[</span><span class="n">SAMPLEFORMAT</span><span class="p">]</span> <span class="o">=</span> <span class="nb">format</span> <span class="n">ifd</span><span class="p">[</span><span class="n">PHOTOMETRIC_INTERPRETATION</span><span class="p">]</span> <span class="o">=</span> <span class="n">photo</span> <span class="k">if</span> <span class="n">im</span><span class="o">.</span><span class="n">mode</span> <span class="o">==</span> <span class="s2">"P"</span><span class="p">:</span> <span class="n">lut</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">im</span><span class="o">.</span><span class="n">getpalette</span><span class="p">(</span><span class="s2">"RGB"</span><span class="p">,</span> <span class="s2">"RGB;L"</span><span class="p">)</span> <span class="n">ifd</span><span class="p">[</span><span class="n">COLORMAP</span><span class="p">]</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">i8</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">*</span> <span class="mi">256</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">lut</span><span class="p">)</span> <span class="c1"># data orientation</span> <span class="n">stride</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">bits</span><span class="p">)</span> <span class="o">*</span> <span class="p">((</span><span class="n">im</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">bits</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="mi">7</span><span class="p">)</span><span class="o">//</span><span class="mi">8</span><span class="p">)</span> <span class="n">ifd</span><span class="p">[</span><span class="n">ROWSPERSTRIP</span><span class="p">]</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="n">ifd</span><span class="p">[</span><span class="n">STRIPBYTECOUNTS</span><span class="p">]</span> <span class="o">=</span> <span class="n">stride</span> <span class="o">*</span> <span class="n">im</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="n">ifd</span><span class="p">[</span><span class="n">STRIPOFFSETS</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># this is adjusted by IFD writer</span> <span class="c1"># no compression by default:</span> <span class="n">ifd</span><span class="p">[</span><span class="n">COMPRESSION</span><span class="p">]</span> <span class="o">=</span> <span class="n">COMPRESSION_INFO_REV</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">compression</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="k">if</span> <span class="n">libtiff</span><span class="p">:</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"Saving using libtiff encoder"</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"Items: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">ifd</span><span class="o">.</span><span class="n">items</span><span class="p">()))</span> <span class="n">_fp</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="s2">"fileno"</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="n">fp</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="n">_fp</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">dup</span><span class="p">(</span><span class="n">fp</span><span class="o">.</span><span class="n">fileno</span><span class="p">())</span> <span class="k">except</span> <span class="n">io</span><span class="o">.</span><span class="n">UnsupportedOperation</span><span class="p">:</span> <span class="k">pass</span> <span class="c1"># STRIPOFFSETS and STRIPBYTECOUNTS are added by the library</span> <span class="c1"># based on the data in the strip.</span> <span class="n">blocklist</span> <span class="o">=</span> <span class="p">[</span><span class="n">STRIPOFFSETS</span><span class="p">,</span> <span class="n">STRIPBYTECOUNTS</span><span class="p">]</span> <span class="n">atts</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># bits per sample is a single short in the tiff directory, not a list.</span> <span class="n">atts</span><span class="p">[</span><span class="n">BITSPERSAMPLE</span><span class="p">]</span> <span class="o">=</span> <span class="n">bits</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># Merge the ones that we have with (optional) more bits from</span> <span class="c1"># the original file, e.g x,y resolution so that we can</span> <span class="c1"># save(load('')) == original file.</span> <span class="n">legacy_ifd</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">im</span><span class="p">,</span> <span class="s1">'tag'</span><span class="p">):</span> <span class="n">legacy_ifd</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">tag</span><span class="o">.</span><span class="n">to_v2</span><span class="p">()</span> <span class="k">for</span> <span class="n">tag</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">ifd</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">im</span><span class="p">,</span> <span class="s1">'tag_v2'</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="n">legacy_ifd</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span> <span class="c1"># Libtiff can only process certain core items without adding</span> <span class="c1"># them to the custom dictionary.</span> <span class="c1"># Support for custom items has only been been added</span> <span class="c1"># for int, float, unicode, string and byte values</span> <span class="k">if</span> <span class="n">tag</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">LIBTIFF_CORE</span><span class="p">:</span> <span class="k">if</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">lookup</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">TiffTags</span><span class="o">.</span><span class="n">UNDEFINED</span><span class="p">:</span> <span class="k">continue</span> <span class="k">if</span> <span class="p">(</span><span class="n">distutils</span><span class="o">.</span><span class="n">version</span><span class="o">.</span><span class="n">StrictVersion</span><span class="p">(</span><span class="n">_libtiff_version</span><span class="p">())</span> <span class="o"><</span> <span class="n">distutils</span><span class="o">.</span><span class="n">version</span><span class="o">.</span><span class="n">StrictVersion</span><span class="p">(</span><span class="s2">"4.0"</span><span class="p">))</span> \ <span class="ow">or</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">))</span> <span class="ow">or</span> <span class="p">(</span><span class="ow">not</span> <span class="n">py3</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">unicode</span><span class="p">))):</span> <span class="c1"># noqa: F821</span> <span class="k">continue</span> <span class="k">if</span> <span class="n">tag</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">atts</span> <span class="ow">and</span> <span class="n">tag</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">blocklist</span><span class="p">:</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span> <span class="k">if</span> <span class="n">py3</span> <span class="k">else</span> <span class="n">unicode</span><span class="p">):</span> <span class="c1"># noqa: F821</span> <span class="n">atts</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">'ascii'</span><span class="p">,</span> <span class="s1">'replace'</span><span class="p">)</span> <span class="o">+</span> <span class="sa">b</span><span class="s2">"</span><span class="se">\0</span><span class="s2">"</span> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">IFDRational</span><span class="p">):</span> <span class="n">atts</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">atts</span><span class="p">[</span><span class="n">tag</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span> <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"Converted items: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">atts</span><span class="o">.</span><span class="n">items</span><span class="p">()))</span> <span class="c1"># libtiff always expects the bytes in native order.</span> <span class="c1"># we're storing image byte order. So, if the rawmode</span> <span class="c1"># contains I;16, we need to convert from native to image</span> <span class="c1"># byte order.</span> <span class="k">if</span> <span class="n">im</span><span class="o">.</span><span class="n">mode</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'I;16B'</span><span class="p">,</span> <span class="s1">'I;16'</span><span class="p">):</span> <span class="n">rawmode</span> <span class="o">=</span> <span class="s1">'I;16N'</span> <span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="n">rawmode</span><span class="p">,</span> <span class="n">compression</span><span class="p">,</span> <span class="n">_fp</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">atts</span><span class="p">)</span> <span class="n">e</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">_getencoder</span><span class="p">(</span><span class="n">im</span><span class="o">.</span><span class="n">mode</span><span class="p">,</span> <span class="s1">'libtiff'</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">im</span><span class="o">.</span><span class="n">encoderconfig</span><span class="p">)</span> <span class="n">e</span><span class="o">.</span><span class="n">setimage</span><span class="p">(</span><span class="n">im</span><span class="o">.</span><span class="n">im</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span><span class="o">+</span><span class="n">im</span><span class="o">.</span><span class="n">size</span><span class="p">)</span> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span> <span class="c1"># undone, change to self.decodermaxblock:</span> <span class="n">l</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="mi">16</span><span class="o">*</span><span class="mi">1024</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">_fp</span><span class="p">:</span> <span class="n">fp</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="k">if</span> <span class="n">s</span><span class="p">:</span> <span class="k">break</span> <span class="k">if</span> <span class="n">s</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s2">"encoder error </span><span class="si">%d</span><span class="s2"> when writing image file"</span> <span class="o">%</span> <span class="n">s</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">ifd</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">fp</span><span class="p">)</span> <span class="n">ImageFile</span><span class="o">.</span><span class="n">_save</span><span class="p">(</span><span class="n">im</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="p">[</span> <span class="p">(</span><span class="s2">"raw"</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span><span class="o">+</span><span class="n">im</span><span class="o">.</span><span class="n">size</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="p">(</span><span class="n">rawmode</span><span class="p">,</span> <span class="n">stride</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="p">])</span> <span class="c1"># -- helper for multi-page save --</span> <span class="k">if</span> <span class="s2">"_debug_multipage"</span> <span class="ow">in</span> <span class="n">im</span><span class="o">.</span><span class="n">encoderinfo</span><span class="p">:</span> <span class="c1"># just to access o32 and o16 (using correct byte order)</span> <span class="n">im</span><span class="o">.</span><span class="n">_debug_multipage</span> <span class="o">=</span> <span class="n">ifd</span> <div class="viewcode-block" id="AppendingTiffWriter"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter">[docs]</a><span class="k">class</span> <span class="nc">AppendingTiffWriter</span><span class="p">:</span> <span class="n">fieldSizes</span> <span class="o">=</span> <span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="c1"># None</span> <span class="mi">1</span><span class="p">,</span> <span class="c1"># byte</span> <span class="mi">1</span><span class="p">,</span> <span class="c1"># ascii</span> <span class="mi">2</span><span class="p">,</span> <span class="c1"># short</span> <span class="mi">4</span><span class="p">,</span> <span class="c1"># long</span> <span class="mi">8</span><span class="p">,</span> <span class="c1"># rational</span> <span class="mi">1</span><span class="p">,</span> <span class="c1"># sbyte</span> <span class="mi">1</span><span class="p">,</span> <span class="c1"># undefined</span> <span class="mi">2</span><span class="p">,</span> <span class="c1"># sshort</span> <span class="mi">4</span><span class="p">,</span> <span class="c1"># slong</span> <span class="mi">8</span><span class="p">,</span> <span class="c1"># srational</span> <span class="mi">4</span><span class="p">,</span> <span class="c1"># float</span> <span class="mi">8</span><span class="p">,</span> <span class="c1"># double</span> <span class="p">]</span> <span class="c1"># StripOffsets = 273</span> <span class="c1"># FreeOffsets = 288</span> <span class="c1"># TileOffsets = 324</span> <span class="c1"># JPEGQTables = 519</span> <span class="c1"># JPEGDCTables = 520</span> <span class="c1"># JPEGACTables = 521</span> <span class="n">Tags</span> <span class="o">=</span> <span class="p">{</span><span class="mi">273</span><span class="p">,</span> <span class="mi">288</span><span class="p">,</span> <span class="mi">324</span><span class="p">,</span> <span class="mi">519</span><span class="p">,</span> <span class="mi">520</span><span class="p">,</span> <span class="mi">521</span><span class="p">}</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fn</span><span class="p">,</span> <span class="n">new</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">fn</span><span class="p">,</span> <span class="s1">'read'</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span> <span class="o">=</span> <span class="n">fn</span> <span class="bp">self</span><span class="o">.</span><span class="n">close_fp</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">fn</span> <span class="bp">self</span><span class="o">.</span><span class="n">close_fp</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">try</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">fn</span><span class="p">,</span> <span class="s2">"w+b"</span> <span class="k">if</span> <span class="n">new</span> <span class="k">else</span> <span class="s2">"r+b"</span><span class="p">)</span> <span class="k">except</span> <span class="ne">IOError</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">fn</span><span class="p">,</span> <span class="s2">"w+b"</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">beginning</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">setup</span><span class="p">()</span> <div class="viewcode-block" id="AppendingTiffWriter.setup"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.setup">[docs]</a> <span class="k">def</span> <span class="nf">setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># Reset everything.</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">beginning</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">SEEK_SET</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">whereToWriteNewIFDOffset</span> <span class="o">=</span> <span class="kc">None</span> <span class="bp">self</span><span class="o">.</span><span class="n">offsetOfNewPage</span> <span class="o">=</span> <span class="mi">0</span> <span class="bp">self</span><span class="o">.</span><span class="n">IIMM</span> <span class="o">=</span> <span class="n">IIMM</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">IIMM</span><span class="p">:</span> <span class="c1"># empty file - first page</span> <span class="bp">self</span><span class="o">.</span><span class="n">isFirst</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">isFirst</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">if</span> <span class="n">IIMM</span> <span class="o">==</span> <span class="sa">b</span><span class="s2">"II</span><span class="se">\x2a\x00</span><span class="s2">"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">setEndian</span><span class="p">(</span><span class="s2">"<"</span><span class="p">)</span> <span class="k">elif</span> <span class="n">IIMM</span> <span class="o">==</span> <span class="sa">b</span><span class="s2">"MM</span><span class="se">\x00\x2a</span><span class="s2">"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">setEndian</span><span class="p">(</span><span class="s2">">"</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"Invalid TIFF file header"</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">skipIFDs</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">goToEnd</span><span class="p">()</span></div> <div class="viewcode-block" id="AppendingTiffWriter.finalize"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.finalize">[docs]</a> <span class="k">def</span> <span class="nf">finalize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">isFirst</span><span class="p">:</span> <span class="k">return</span> <span class="c1"># fix offsets</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">offsetOfNewPage</span><span class="p">)</span> <span class="n">IIMM</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">IIMM</span><span class="p">:</span> <span class="c1"># raise RuntimeError("nothing written into new page")</span> <span class="c1"># Make it easy to finish a frame without committing to a new one.</span> <span class="k">return</span> <span class="k">if</span> <span class="n">IIMM</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">IIMM</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"IIMM of new page doesn't match IIMM of "</span> <span class="s2">"first page"</span><span class="p">)</span> <span class="n">IFDoffset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">readLong</span><span class="p">()</span> <span class="n">IFDoffset</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">offsetOfNewPage</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">whereToWriteNewIFDOffset</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">writeLong</span><span class="p">(</span><span class="n">IFDoffset</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">IFDoffset</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixIFD</span><span class="p">()</span></div> <div class="viewcode-block" id="AppendingTiffWriter.newFrame"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.newFrame">[docs]</a> <span class="k">def</span> <span class="nf">newFrame</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># Call this to finish a frame.</span> <span class="bp">self</span><span class="o">.</span><span class="n">finalize</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">setup</span><span class="p">()</span></div> <span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">traceback</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">close_fp</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="k">return</span> <span class="kc">False</span> <div class="viewcode-block" id="AppendingTiffWriter.tell"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.tell">[docs]</a> <span class="k">def</span> <span class="nf">tell</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">offsetOfNewPage</span></div> <div class="viewcode-block" id="AppendingTiffWriter.seek"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.seek">[docs]</a> <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">whence</span><span class="p">):</span> <span class="k">if</span> <span class="n">whence</span> <span class="o">==</span> <span class="n">os</span><span class="o">.</span><span class="n">SEEK_SET</span><span class="p">:</span> <span class="n">offset</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">offsetOfNewPage</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">offset</span><span class="p">,</span> <span class="n">whence</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span></div> <div class="viewcode-block" id="AppendingTiffWriter.goToEnd"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.goToEnd">[docs]</a> <span class="k">def</span> <span class="nf">goToEnd</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">SEEK_END</span><span class="p">)</span> <span class="n">pos</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="c1"># pad to 16 byte boundary</span> <span class="n">padBytes</span> <span class="o">=</span> <span class="mi">16</span> <span class="o">-</span> <span class="n">pos</span> <span class="o">%</span> <span class="mi">16</span> <span class="k">if</span> <span class="mi">0</span> <span class="o"><</span> <span class="n">padBytes</span> <span class="o"><</span> <span class="mi">16</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">bytes</span><span class="p">(</span><span class="nb">bytearray</span><span class="p">(</span><span class="n">padBytes</span><span class="p">)))</span> <span class="bp">self</span><span class="o">.</span><span class="n">offsetOfNewPage</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span></div> <div class="viewcode-block" id="AppendingTiffWriter.setEndian"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.setEndian">[docs]</a> <span class="k">def</span> <span class="nf">setEndian</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endian</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">endian</span> <span class="o">=</span> <span class="n">endian</span> <span class="bp">self</span><span class="o">.</span><span class="n">longFmt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">endian</span> <span class="o">+</span> <span class="s2">"L"</span> <span class="bp">self</span><span class="o">.</span><span class="n">shortFmt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">endian</span> <span class="o">+</span> <span class="s2">"H"</span> <span class="bp">self</span><span class="o">.</span><span class="n">tagFormat</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">endian</span> <span class="o">+</span> <span class="s2">"HHL"</span></div> <div class="viewcode-block" id="AppendingTiffWriter.skipIFDs"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.skipIFDs">[docs]</a> <span class="k">def</span> <span class="nf">skipIFDs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span> <span class="n">IFDoffset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">readLong</span><span class="p">()</span> <span class="k">if</span> <span class="n">IFDoffset</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">whereToWriteNewIFDOffset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="o">-</span> <span class="mi">4</span> <span class="k">break</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">IFDoffset</span><span class="p">)</span> <span class="n">numTags</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">readShort</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">numTags</span> <span class="o">*</span> <span class="mi">12</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">SEEK_CUR</span><span class="p">)</span></div> <div class="viewcode-block" id="AppendingTiffWriter.write"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.write">[docs]</a> <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span></div> <div class="viewcode-block" id="AppendingTiffWriter.readShort"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.readShort">[docs]</a> <span class="k">def</span> <span class="nf">readShort</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">value</span><span class="p">,</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">shortFmt</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span> <span class="k">return</span> <span class="n">value</span></div> <div class="viewcode-block" id="AppendingTiffWriter.readLong"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.readLong">[docs]</a> <span class="k">def</span> <span class="nf">readLong</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">value</span><span class="p">,</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">longFmt</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">4</span><span class="p">))</span> <span class="k">return</span> <span class="n">value</span></div> <div class="viewcode-block" id="AppendingTiffWriter.rewriteLastShortToLong"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.rewriteLastShortToLong">[docs]</a> <span class="k">def</span> <span class="nf">rewriteLastShortToLong</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">SEEK_CUR</span><span class="p">)</span> <span class="n">bytesWritten</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">longFmt</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span> <span class="k">if</span> <span class="n">bytesWritten</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">bytesWritten</span> <span class="o">!=</span> <span class="mi">4</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"wrote only </span><span class="si">%u</span><span class="s2"> bytes but wanted 4"</span> <span class="o">%</span> <span class="n">bytesWritten</span><span class="p">)</span></div> <div class="viewcode-block" id="AppendingTiffWriter.rewriteLastShort"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.rewriteLastShort">[docs]</a> <span class="k">def</span> <span class="nf">rewriteLastShort</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">SEEK_CUR</span><span class="p">)</span> <span class="n">bytesWritten</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">shortFmt</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span> <span class="k">if</span> <span class="n">bytesWritten</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">bytesWritten</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"wrote only </span><span class="si">%u</span><span class="s2"> bytes but wanted 2"</span> <span class="o">%</span> <span class="n">bytesWritten</span><span class="p">)</span></div> <div class="viewcode-block" id="AppendingTiffWriter.rewriteLastLong"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.rewriteLastLong">[docs]</a> <span class="k">def</span> <span class="nf">rewriteLastLong</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="o">-</span><span class="mi">4</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">SEEK_CUR</span><span class="p">)</span> <span class="n">bytesWritten</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">longFmt</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span> <span class="k">if</span> <span class="n">bytesWritten</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">bytesWritten</span> <span class="o">!=</span> <span class="mi">4</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"wrote only </span><span class="si">%u</span><span class="s2"> bytes but wanted 4"</span> <span class="o">%</span> <span class="n">bytesWritten</span><span class="p">)</span></div> <div class="viewcode-block" id="AppendingTiffWriter.writeShort"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.writeShort">[docs]</a> <span class="k">def</span> <span class="nf">writeShort</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="n">bytesWritten</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">shortFmt</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span> <span class="k">if</span> <span class="n">bytesWritten</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">bytesWritten</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"wrote only </span><span class="si">%u</span><span class="s2"> bytes but wanted 2"</span> <span class="o">%</span> <span class="n">bytesWritten</span><span class="p">)</span></div> <div class="viewcode-block" id="AppendingTiffWriter.writeLong"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.writeLong">[docs]</a> <span class="k">def</span> <span class="nf">writeLong</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="n">bytesWritten</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">longFmt</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span> <span class="k">if</span> <span class="n">bytesWritten</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">bytesWritten</span> <span class="o">!=</span> <span class="mi">4</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"wrote only </span><span class="si">%u</span><span class="s2"> bytes but wanted 4"</span> <span class="o">%</span> <span class="n">bytesWritten</span><span class="p">)</span></div> <div class="viewcode-block" id="AppendingTiffWriter.close"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">finalize</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></div> <div class="viewcode-block" id="AppendingTiffWriter.fixIFD"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.fixIFD">[docs]</a> <span class="k">def</span> <span class="nf">fixIFD</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">numTags</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">readShort</span><span class="p">()</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">numTags</span><span class="p">):</span> <span class="n">tag</span><span class="p">,</span> <span class="n">fieldType</span><span class="p">,</span> <span class="n">count</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tagFormat</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">8</span><span class="p">))</span> <span class="n">fieldSize</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fieldSizes</span><span class="p">[</span><span class="n">fieldType</span><span class="p">]</span> <span class="n">totalSize</span> <span class="o">=</span> <span class="n">fieldSize</span> <span class="o">*</span> <span class="n">count</span> <span class="n">isLocal</span> <span class="o">=</span> <span class="p">(</span><span class="n">totalSize</span> <span class="o"><=</span> <span class="mi">4</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">isLocal</span><span class="p">:</span> <span class="n">offset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">readLong</span><span class="p">()</span> <span class="n">offset</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">offsetOfNewPage</span> <span class="bp">self</span><span class="o">.</span><span class="n">rewriteLastLong</span><span class="p">(</span><span class="n">offset</span><span class="p">)</span> <span class="k">if</span> <span class="n">tag</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">Tags</span><span class="p">:</span> <span class="n">curPos</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="k">if</span> <span class="n">isLocal</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixOffsets</span><span class="p">(</span><span class="n">count</span><span class="p">,</span> <span class="n">isShort</span><span class="o">=</span><span class="p">(</span><span class="n">fieldSize</span> <span class="o">==</span> <span class="mi">2</span><span class="p">),</span> <span class="n">isLong</span><span class="o">=</span><span class="p">(</span><span class="n">fieldSize</span> <span class="o">==</span> <span class="mi">4</span><span class="p">))</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">curPos</span> <span class="o">+</span> <span class="mi">4</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">offset</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">fixOffsets</span><span class="p">(</span><span class="n">count</span><span class="p">,</span> <span class="n">isShort</span><span class="o">=</span><span class="p">(</span><span class="n">fieldSize</span> <span class="o">==</span> <span class="mi">2</span><span class="p">),</span> <span class="n">isLong</span><span class="o">=</span><span class="p">(</span><span class="n">fieldSize</span> <span class="o">==</span> <span class="mi">4</span><span class="p">))</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">curPos</span><span class="p">)</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">curPos</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">elif</span> <span class="n">isLocal</span><span class="p">:</span> <span class="c1"># skip the locally stored value that is not an offset</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">SEEK_CUR</span><span class="p">)</span></div> <div class="viewcode-block" id="AppendingTiffWriter.fixOffsets"><a class="viewcode-back" href="../../reference/plugins.html#PIL.TiffImagePlugin.AppendingTiffWriter.fixOffsets">[docs]</a> <span class="k">def</span> <span class="nf">fixOffsets</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">isShort</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">isLong</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">isShort</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">isLong</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"offset is neither short nor long"</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">count</span><span class="p">):</span> <span class="n">offset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">readShort</span><span class="p">()</span> <span class="k">if</span> <span class="n">isShort</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">readLong</span><span class="p">()</span> <span class="n">offset</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">offsetOfNewPage</span> <span class="k">if</span> <span class="n">isShort</span> <span class="ow">and</span> <span class="n">offset</span> <span class="o">>=</span> <span class="mi">65536</span><span class="p">:</span> <span class="c1"># offset is now too large - we must convert shorts to longs</span> <span class="k">if</span> <span class="n">count</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"not implemented"</span><span class="p">)</span> <span class="c1"># XXX TODO</span> <span class="c1"># simple case - the offset is just one and therefore it is</span> <span class="c1"># local (not referenced with another offset)</span> <span class="bp">self</span><span class="o">.</span><span class="n">rewriteLastShortToLong</span><span class="p">(</span><span class="n">offset</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">SEEK_CUR</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">writeShort</span><span class="p">(</span><span class="n">TiffTags</span><span class="o">.</span><span class="n">LONG</span><span class="p">)</span> <span class="c1"># rewrite the type to LONG</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">SEEK_CUR</span><span class="p">)</span> <span class="k">elif</span> <span class="n">isShort</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">rewriteLastShort</span><span class="p">(</span><span class="n">offset</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">rewriteLastLong</span><span class="p">(</span><span class="n">offset</span><span class="p">)</span></div></div> <span class="k">def</span> <span class="nf">_save_all</span><span class="p">(</span><span class="n">im</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span> <span class="n">encoderinfo</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">encoderinfo</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="n">encoderconfig</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">encoderconfig</span> <span class="n">append_images</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">encoderinfo</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"append_images"</span><span class="p">,</span> <span class="p">[]))</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">im</span><span class="p">,</span> <span class="s2">"n_frames"</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">append_images</span><span class="p">:</span> <span class="k">return</span> <span class="n">_save</span><span class="p">(</span><span class="n">im</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span> <span class="n">cur_idx</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="k">with</span> <span class="n">AppendingTiffWriter</span><span class="p">(</span><span class="n">fp</span><span class="p">)</span> <span class="k">as</span> <span class="n">tf</span><span class="p">:</span> <span class="k">for</span> <span class="n">ims</span> <span class="ow">in</span> <span class="p">[</span><span class="n">im</span><span class="p">]</span><span class="o">+</span><span class="n">append_images</span><span class="p">:</span> <span class="n">ims</span><span class="o">.</span><span class="n">encoderinfo</span> <span class="o">=</span> <span class="n">encoderinfo</span> <span class="n">ims</span><span class="o">.</span><span class="n">encoderconfig</span> <span class="o">=</span> <span class="n">encoderconfig</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">ims</span><span class="p">,</span> <span class="s2">"n_frames"</span><span class="p">):</span> <span class="n">nfr</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">else</span><span class="p">:</span> <span class="n">nfr</span> <span class="o">=</span> <span class="n">ims</span><span class="o">.</span><span class="n">n_frames</span> <span class="k">for</span> <span class="n">idx</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">nfr</span><span class="p">):</span> <span class="n">ims</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span> <span class="n">ims</span><span class="o">.</span><span class="n">load</span><span class="p">()</span> <span class="n">_save</span><span class="p">(</span><span class="n">ims</span><span class="p">,</span> <span class="n">tf</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span> <span class="n">tf</span><span class="o">.</span><span class="n">newFrame</span><span class="p">()</span> <span class="k">finally</span><span class="p">:</span> <span class="n">im</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">cur_idx</span><span class="p">)</span> <span class="c1">#</span> <span class="c1"># --------------------------------------------------------------------</span> <span class="c1"># Register</span> <span class="n">Image</span><span class="o">.</span><span class="n">register_open</span><span class="p">(</span><span class="n">TiffImageFile</span><span class="o">.</span><span class="n">format</span><span class="p">,</span> <span class="n">TiffImageFile</span><span class="p">,</span> <span class="n">_accept</span><span class="p">)</span> <span class="n">Image</span><span class="o">.</span><span class="n">register_save</span><span class="p">(</span><span class="n">TiffImageFile</span><span class="o">.</span><span class="n">format</span><span class="p">,</span> <span class="n">_save</span><span class="p">)</span> <span class="n">Image</span><span class="o">.</span><span class="n">register_save_all</span><span class="p">(</span><span class="n">TiffImageFile</span><span class="o">.</span><span class="n">format</span><span class="p">,</span> <span class="n">_save_all</span><span class="p">)</span> <span class="n">Image</span><span class="o">.</span><span class="n">register_extensions</span><span class="p">(</span><span class="n">TiffImageFile</span><span class="o">.</span><span class="n">format</span><span class="p">,</span> <span class="p">[</span><span class="s2">".tif"</span><span class="p">,</span> <span class="s2">".tiff"</span><span class="p">])</span> <span class="n">Image</span><span class="o">.</span><span class="n">register_mime</span><span class="p">(</span><span class="n">TiffImageFile</span><span class="o">.</span><span class="n">format</span><span class="p">,</span> <span class="s2">"image/tiff"</span><span class="p">)</span> </pre></div> </div> </div> <footer> <hr/> <div role="contentinfo"> <p> © Copyright 1995-2011 Fredrik Lundh, 2010-2018 Alex Clark and Contributors </p> </div> Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. </footer> </div> </div> </section> </div> <script type="text/javascript"> jQuery(function () { SphinxRtdTheme.Navigation.enable(true); }); </script> </body> </html>