Sophie

Sophie

distrib > Mageia > 7 > armv7hl > by-pkgid > e5936adde9b1ea7ed6dc23c107bda8ab > files > 65

python3-pillow-doc-5.4.1-1.1.mga7.noarch.rpm



<!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 &mdash; 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> &raquo;</li>
        
          <li><a href="../index.html">Module code</a> &raquo;</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&#39;t really stand for</span>
<span class="c1"># &quot;thousands of incompatible file formats,&quot; 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&#39;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">&quot;1.3.5&quot;</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">&quot;II&quot;</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">&quot;MM&quot;</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 =&gt; pil compression name</span>
    <span class="mi">1</span><span class="p">:</span> <span class="s2">&quot;raw&quot;</span><span class="p">,</span>
    <span class="mi">2</span><span class="p">:</span> <span class="s2">&quot;tiff_ccitt&quot;</span><span class="p">,</span>
    <span class="mi">3</span><span class="p">:</span> <span class="s2">&quot;group3&quot;</span><span class="p">,</span>
    <span class="mi">4</span><span class="p">:</span> <span class="s2">&quot;group4&quot;</span><span class="p">,</span>
    <span class="mi">5</span><span class="p">:</span> <span class="s2">&quot;tiff_lzw&quot;</span><span class="p">,</span>
    <span class="mi">6</span><span class="p">:</span> <span class="s2">&quot;tiff_jpeg&quot;</span><span class="p">,</span>  <span class="c1"># obsolete</span>
    <span class="mi">7</span><span class="p">:</span> <span class="s2">&quot;jpeg&quot;</span><span class="p">,</span>
    <span class="mi">8</span><span class="p">:</span> <span class="s2">&quot;tiff_adobe_deflate&quot;</span><span class="p">,</span>
    <span class="mi">32771</span><span class="p">:</span> <span class="s2">&quot;tiff_raw_16&quot;</span><span class="p">,</span>  <span class="c1"># 16-bit padding</span>
    <span class="mi">32773</span><span class="p">:</span> <span class="s2">&quot;packbits&quot;</span><span class="p">,</span>
    <span class="mi">32809</span><span class="p">:</span> <span class="s2">&quot;tiff_thunderscan&quot;</span><span class="p">,</span>
    <span class="mi">32946</span><span class="p">:</span> <span class="s2">&quot;tiff_deflate&quot;</span><span class="p">,</span>
    <span class="mi">34676</span><span class="p">:</span> <span class="s2">&quot;tiff_sgilog&quot;</span><span class="p">,</span>
    <span class="mi">34677</span><span class="p">:</span> <span class="s2">&quot;tiff_sgilog24&quot;</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) =&gt; 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">&quot;1&quot;</span><span class="p">,</span> <span class="s2">&quot;1;I&quot;</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">&quot;1&quot;</span><span class="p">,</span> <span class="s2">&quot;1;I&quot;</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">&quot;1&quot;</span><span class="p">,</span> <span class="s2">&quot;1;IR&quot;</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">&quot;1&quot;</span><span class="p">,</span> <span class="s2">&quot;1;IR&quot;</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">&quot;1&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</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">&quot;1&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</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">&quot;1&quot;</span><span class="p">,</span> <span class="s2">&quot;1;R&quot;</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">&quot;1&quot;</span><span class="p">,</span> <span class="s2">&quot;1;R&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;2I&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;2I&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;2IR&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;2IR&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;2&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;2&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;2R&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;2R&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;4I&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;4I&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;4IR&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;4IR&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;4&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;4&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;4R&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;4R&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;I&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;I&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;IR&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;IR&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;R&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;L;R&quot;</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">&quot;I;16&quot;</span><span class="p">,</span> <span class="s2">&quot;I;12&quot;</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">&quot;I;16&quot;</span><span class="p">,</span> <span class="s2">&quot;I;16&quot;</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">&quot;I;16B&quot;</span><span class="p">,</span> <span class="s2">&quot;I;16B&quot;</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">&quot;I&quot;</span><span class="p">,</span> <span class="s2">&quot;I;16S&quot;</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">&quot;I&quot;</span><span class="p">,</span> <span class="s2">&quot;I;16BS&quot;</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">&quot;F&quot;</span><span class="p">,</span> <span class="s2">&quot;F;32F&quot;</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">&quot;F&quot;</span><span class="p">,</span> <span class="s2">&quot;F;32BF&quot;</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">&quot;I&quot;</span><span class="p">,</span> <span class="s2">&quot;I;32N&quot;</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">&quot;I&quot;</span><span class="p">,</span> <span class="s2">&quot;I;32S&quot;</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">&quot;I&quot;</span><span class="p">,</span> <span class="s2">&quot;I;32BS&quot;</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">&quot;F&quot;</span><span class="p">,</span> <span class="s2">&quot;F;32F&quot;</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">&quot;F&quot;</span><span class="p">,</span> <span class="s2">&quot;F;32BF&quot;</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">&quot;LA&quot;</span><span class="p">,</span> <span class="s2">&quot;LA&quot;</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">&quot;LA&quot;</span><span class="p">,</span> <span class="s2">&quot;LA&quot;</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">&quot;RGB&quot;</span><span class="p">,</span> <span class="s2">&quot;RGB&quot;</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">&quot;RGB&quot;</span><span class="p">,</span> <span class="s2">&quot;RGB&quot;</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">&quot;RGB&quot;</span><span class="p">,</span> <span class="s2">&quot;RGB;R&quot;</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">&quot;RGB&quot;</span><span class="p">,</span> <span class="s2">&quot;RGB;R&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBA&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBA&quot;</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">&quot;RGBX&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBX&quot;</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">&quot;RGBX&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBX&quot;</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">&quot;RGBX&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBXX&quot;</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">&quot;RGBX&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBXX&quot;</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">&quot;RGBX&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBXXX&quot;</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">&quot;RGBX&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBXXX&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBa&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBa&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBaX&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBaX&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBaXX&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBaXX&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBA&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBA&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBAX&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBAX&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBAXX&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBAXX&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBA&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBA&quot;</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">&quot;RGB&quot;</span><span class="p">,</span> <span class="s2">&quot;RGB;16L&quot;</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">&quot;RGB&quot;</span><span class="p">,</span> <span class="s2">&quot;RGB;16B&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBA;16L&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBA;16B&quot;</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">&quot;RGBX&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBX;16L&quot;</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">&quot;RGBX&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBX;16B&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBa;16L&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBa;16B&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBA;16L&quot;</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">&quot;RGBA&quot;</span><span class="p">,</span> <span class="s2">&quot;RGBA;16B&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P;1&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P;1&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P;1R&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P;1R&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P;2&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P;2&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P;2R&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P;2R&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P;4&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P;4&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P;4R&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P;4R&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P&quot;</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">&quot;PA&quot;</span><span class="p">,</span> <span class="s2">&quot;PA&quot;</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">&quot;PA&quot;</span><span class="p">,</span> <span class="s2">&quot;PA&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P;R&quot;</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">&quot;P&quot;</span><span class="p">,</span> <span class="s2">&quot;P;R&quot;</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">&quot;CMYK&quot;</span><span class="p">,</span> <span class="s2">&quot;CMYK&quot;</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">&quot;CMYK&quot;</span><span class="p">,</span> <span class="s2">&quot;CMYK&quot;</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">&quot;CMYK&quot;</span><span class="p">,</span> <span class="s2">&quot;CMYKX&quot;</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">&quot;CMYK&quot;</span><span class="p">,</span> <span class="s2">&quot;CMYKX&quot;</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">&quot;CMYK&quot;</span><span class="p">,</span> <span class="s2">&quot;CMYKXX&quot;</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">&quot;CMYK&quot;</span><span class="p">,</span> <span class="s2">&quot;CMYKXX&quot;</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">&quot;RGB&quot;</span><span class="p">,</span> <span class="s2">&quot;RGB&quot;</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">&quot;RGB&quot;</span><span class="p">,</span> <span class="s2">&quot;RGB&quot;</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">&quot;LAB&quot;</span><span class="p">,</span> <span class="s2">&quot;LAB&quot;</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">&quot;LAB&quot;</span><span class="p">,</span> <span class="s2">&quot;LAB&quot;</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">&quot;MM</span><span class="se">\x00\x2A</span><span class="s2">&quot;</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">&quot;II</span><span class="se">\x2A\x00</span><span class="s2">&quot;</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">&quot;MM</span><span class="se">\x2A\x00</span><span class="s2">&quot;</span><span class="p">,</span>  <span class="c1"># Invalid TIFF header, assume big-endian</span>
    <span class="sa">b</span><span class="s2">&quot;II</span><span class="se">\x00\x2A</span><span class="s2">&quot;</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">&gt;</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">&quot;</span><span class="se">\n</span><span class="s2">&quot;</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">&quot;Version &quot;</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">&quot;&quot;&quot; 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">    &quot;&quot;&quot;</span>

    <span class="sd">&quot;&quot;&quot; If the denominator is 0, store this as a float(&#39;nan&#39;), otherwise store</span>
<span class="sd">    as a fractions.Fraction(). Delegate as appropriate</span>

<span class="sd">    &quot;&quot;&quot;</span>

    <span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;_numerator&#39;</span><span class="p">,</span> <span class="s1">&#39;_denominator&#39;</span><span class="p">,</span> <span class="s1">&#39;_val&#39;</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">&quot;&quot;&quot;</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">        &quot;&quot;&quot;</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">&#39;nan&#39;</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">&quot;&quot;&quot;</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">        &quot;&quot;&quot;</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">&quot;&quot;&quot; a = [&#39;add&#39;,&#39;radd&#39;, &#39;sub&#39;, &#39;rsub&#39;,&#39;div&#39;, &#39;rdiv&#39;, &#39;mul&#39;, &#39;rmul&#39;,</span>
<span class="sd">             &#39;truediv&#39;, &#39;rtruediv&#39;, &#39;floordiv&#39;,</span>
<span class="sd">             &#39;rfloordiv&#39;,&#39;mod&#39;,&#39;rmod&#39;, &#39;pow&#39;,&#39;rpow&#39;, &#39;pos&#39;, &#39;neg&#39;,</span>
<span class="sd">             &#39;abs&#39;, &#39;trunc&#39;, &#39;lt&#39;, &#39;gt&#39;, &#39;le&#39;, &#39;ge&#39;, &#39;nonzero&#39;,</span>
<span class="sd">             &#39;ceil&#39;, &#39;floor&#39;, &#39;round&#39;]</span>
<span class="sd">        print(&quot;\n&quot;.join(&quot;__%s__ = _delegate(&#39;__%s__&#39;)&quot; % (s,s) for s in a))</span>
<span class="sd">        &quot;&quot;&quot;</span>

    <span class="fm">__add__</span> <span class="o">=</span> <span class="n">_delegate</span><span class="p">(</span><span class="s1">&#39;__add__&#39;</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">&#39;__radd__&#39;</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">&#39;__sub__&#39;</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">&#39;__rsub__&#39;</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">&#39;__div__&#39;</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">&#39;__rdiv__&#39;</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">&#39;__mul__&#39;</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">&#39;__rmul__&#39;</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">&#39;__truediv__&#39;</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">&#39;__rtruediv__&#39;</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">&#39;__floordiv__&#39;</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">&#39;__rfloordiv__&#39;</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">&#39;__mod__&#39;</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">&#39;__rmod__&#39;</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">&#39;__pow__&#39;</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">&#39;__rpow__&#39;</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">&#39;__pos__&#39;</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">&#39;__neg__&#39;</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">&#39;__abs__&#39;</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">&#39;__trunc__&#39;</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">&#39;__lt__&#39;</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">&#39;__gt__&#39;</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">&#39;__le__&#39;</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">&#39;__ge__&#39;</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">&#39;__nonzero__&#39;</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">&#39;__ceil__&#39;</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">&#39;__floor__&#39;</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">&#39;__round__&#39;</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">&quot;&quot;&quot;This class represents a TIFF tag directory.  To speed things up, we</span>
<span class="sd">    don&#39;t decode tags unless they&#39;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] = &#39;Some Data&#39;</span>
<span class="sd">        ifd.tagtype[key] = 2</span>
<span class="sd">        print(ifd[key])</span>
<span class="sd">        &#39;Some Data&#39;</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">    &quot;&quot;&quot;</span>
    <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">    Documentation:</span>

<span class="sd">        &#39;internal&#39; 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&#39;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">    &quot;&quot;&quot;</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">&quot;II</span><span class="se">\052\0\0\0\0\0</span><span class="s2">&quot;</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">&quot;&quot;&quot;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 &#39;prefix&#39; 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">        &quot;&quot;&quot;</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">&quot;not a TIFF file (header </span><span class="si">%r</span><span class="s2"> not valid)&quot;</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">&quot;&gt;&quot;</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">&quot;&lt;&quot;</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">&quot;not a TIFF IFD&quot;</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">&quot;L&quot;</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">&quot;Not allowing setting of legacy api&quot;</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">&quot;&quot;&quot;</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">        &quot;&quot;&quot;</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">&lt;</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">&quot;ascii&quot;</span><span class="p">,</span> <span class="s1">&#39;replace&#39;</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&#39;d length == 1, Actual length 1, store as element</span>
        <span class="c1"># Spec&#39;d length == 1, Actual &gt; 1, Warn and truncate. Formerly barfed.</span>
        <span class="c1"># No Spec, Actual length 1, Formerly (&lt;4.2) returned a 1 element tuple.</span>
        <span class="c1"># Don&#39;t mess with the legacy api, since it&#39;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&#39;t mess with the legacy api, since it&#39;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&#39;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">&quot;Metadata Warning, tag </span><span class="si">%s</span><span class="s2"> had too many entries: &quot;</span>
                    <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">, expected 1&quot;</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&#39;d length &gt; 1 or undefined</span>
            <span class="c1"># Unspec&#39;d, and length &gt; 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">&quot;load_&quot;</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">&quot;_&quot;</span><span class="p">,</span> <span class="s2">&quot; &quot;</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">&quot;=&quot;</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">&quot;</span><span class="si">{}{}</span><span class="s2">&quot;</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">&quot;&quot;</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">&quot;H&quot;</span><span class="p">,</span> <span class="s2">&quot;short&quot;</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">&quot;L&quot;</span><span class="p">,</span> <span class="s2">&quot;long&quot;</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">&quot;b&quot;</span><span class="p">,</span> <span class="s2">&quot;signed byte&quot;</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">&quot;h&quot;</span><span class="p">,</span> <span class="s2">&quot;signed short&quot;</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">&quot;l&quot;</span><span class="p">,</span> <span class="s2">&quot;signed long&quot;</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">&quot;f&quot;</span><span class="p">,</span> <span class="s2">&quot;float&quot;</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">&quot;d&quot;</span><span class="p">,</span> <span class="s2">&quot;double&quot;</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">&quot;</span><span class="se">\0</span><span class="s2">&quot;</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">&quot;latin-1&quot;</span><span class="p">,</span> <span class="s2">&quot;replace&quot;</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">&#39;ascii&#39;</span><span class="p">,</span> <span class="s1">&#39;replace&#39;</span><span class="p">)</span>
        <span class="k">return</span> <span class="sa">b</span><span class="s2">&quot;&quot;</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">&#39;ascii&#39;</span><span class="p">,</span> <span class="s1">&#39;replace&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\0</span><span class="s2">&quot;</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">&quot;</span><span class="si">{}</span><span class="s2">L&quot;</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">&quot;&quot;</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">&quot;2L&quot;</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">&quot;</span><span class="si">{}</span><span class="s2">l&quot;</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">&quot;&quot;</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">&quot;2L&quot;</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">&quot;Corrupt EXIF data.  &quot;</span> <span class="o">+</span>
                          <span class="s2">&quot;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">. &quot;</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">&quot;H&quot;</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">&quot;HHL4s&quot;</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">&quot;unknown&quot;</span><span class="p">)</span>
                    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;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">)&quot;</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">&quot; &quot;</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">&quot;- unsupported type&quot;</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">&gt;</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">&quot;L&quot;</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">&quot;Tag Location: </span><span class="si">%s</span><span class="s2"> - Data Location: </span><span class="si">%s</span><span class="s2">&quot;</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">&quot; &quot;</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">&quot;Possibly corrupt EXIF data.  &quot;</span>
                                  <span class="s2">&quot;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">.&quot;</span>
                                  <span class="s2">&quot; Skipping tag </span><span class="si">%s</span><span class="s2">&quot;</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">&gt;</span> <span class="mi">32</span><span class="p">:</span>
                        <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;- value: &lt;table: </span><span class="si">%d</span><span class="s2"> bytes&gt;&quot;</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">&quot;- value:&quot;</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">&quot;L&quot;</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">&quot;HL&quot;</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">&quot;H&quot;</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">&quot;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">&quot;</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">&quot;unknown&quot;</span><span class="p">)</span>
                <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;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">)&quot;</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">&quot; &quot;</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">&gt;=</span> <span class="mi">16</span><span class="p">:</span>
                    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;- value: &lt;table: </span><span class="si">%d</span><span class="s2"> bytes&gt;&quot;</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">&quot;- value:&quot;</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">&lt;=</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">&quot;</span><span class="se">\0</span><span class="s2">&quot;</span><span class="p">),</span> <span class="sa">b</span><span class="s2">&quot;&quot;</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">&quot;L&quot;</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">&quot;multistrip support not yet implemented&quot;</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">&quot;L&quot;</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">&quot;L&quot;</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">&gt;</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">&quot;HHL4s&quot;</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">&quot;</span><span class="se">\0\0\0\0</span><span class="s2">&quot;</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">&amp;</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">&quot;</span><span class="se">\0</span><span class="s2">&quot;</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">&quot; &quot;</span><span class="p">,</span> <span class="s2">&quot;_&quot;</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">&quot;load_&quot;</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">&quot;write_&quot;</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">&quot;&quot;&quot;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] = &#39;Some Data&#39;</span>
<span class="sd">        ifd.tagtype[key] = 2</span>
<span class="sd">        print(ifd[key])</span>
<span class="sd">        (&#39;Some Data&#39;,)</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">    &quot;&quot;&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;TIFF&quot;</span>
    <span class="n">format_description</span> <span class="o">=</span> <span class="s2">&quot;Adobe TIFF&quot;</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">&quot;Open the first image in a TIFF file&quot;</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">&quot;*** TiffImageFile._open ***&quot;</span><span class="p">)</span>
            <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;- __first:&quot;</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">&quot;- ifh: &quot;</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">&quot;Select a given frame as current image&quot;</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">&lt;=</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">&quot;no more images in TIFF file&quot;</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">&quot;Seeking to frame </span><span class="si">%s</span><span class="s2">, on frame </span><span class="si">%s</span><span class="s2">, &quot;</span>
                      <span class="s2">&quot;__next </span><span class="si">%s</span><span class="s2">, location: </span><span class="si">%s</span><span class="s2">&quot;</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">&quot;Loading tags, location: </span><span class="si">%s</span><span class="s2">&quot;</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">&quot;Return the current frame number&quot;</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">&#39;Setting the size of a TIFF image directly is deprecated, and will&#39;</span>
            <span class="s1">&#39; be removed in a future version. Use the resize method instead.&#39;</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&#39;re on the first frame, there&#39;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">&quot;&quot;&quot; Overload method triggered when we detect a compressed tiff</span>
<span class="sd">            Calls out to libtiff &quot;&quot;&quot;</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">&quot;cannot load this image&quot;</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">&quot;Not exactly one tile&quot;</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&#39;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">&quot;fileno&quot;</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">&quot;flush&quot;</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&#39;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">&#39;libtiff&#39;</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">&quot;Couldn&#39;t set the image&quot;</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">&quot;getvalue&quot;</span><span class="p">):</span>
            <span class="c1"># We&#39;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&#39;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&#39;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">&quot;have getvalue. just sending in a string from getvalue&quot;</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">&quot;fileno&quot;</span><span class="p">):</span>
            <span class="c1"># we&#39;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">&quot;have fileno, calling fileno version of the decoder.&quot;</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">&quot;fpfp&quot;</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">&quot;don&#39;t have fileno or getvalue. just reading&quot;</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">&lt;</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">&quot;Setup this image object based on current tags&quot;</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">&quot;Windows Media Photo files not yet supported&quot;</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">&quot;*** Summary ***&quot;</span><span class="p">)</span>
            <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;- compression:&quot;</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">&quot;- photometric_interpretation:&quot;</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">&quot;- planar_configuration:&quot;</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">&quot;- fill_order:&quot;</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">&quot;- YCbCr subsampling:&quot;</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">&quot;- size:&quot;</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">&gt;</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&#39;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">&gt;</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">&quot;format key:&quot;</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">&quot;- unsupported format&quot;</span><span class="p">)</span>
            <span class="k">raise</span> <span class="ne">SyntaxError</span><span class="p">(</span><span class="s2">&quot;unknown pixel mode&quot;</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">&quot;- raw mode:&quot;</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">&quot;- pil mode:&quot;</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">&quot;compression&quot;</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">&quot;dpi&quot;</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">&quot;dpi&quot;</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">&quot;dpi&quot;</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">&quot;resolution&quot;</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">&quot;resolution&quot;</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">&#39;raw&#39;</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&#39;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">&quot;format key:&quot;</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&#39;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">&#39;I;16&#39;</span><span class="p">:</span>
                <span class="n">rawmode</span> <span class="o">=</span> <span class="s1">&#39;I;16N&#39;</span>
            <span class="k">if</span> <span class="s1">&#39;;16B&#39;</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">&#39;;16B&#39;</span><span class="p">,</span> <span class="s1">&#39;;16N&#39;</span><span class="p">)</span>
            <span class="k">if</span> <span class="s1">&#39;;16L&#39;</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">&#39;;16L&#39;</span><span class="p">,</span> <span class="s1">&#39;;16N&#39;</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">&gt;</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&#39;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">&gt;=</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">&gt;=</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">&quot;- unsupported data organization&quot;</span><span class="p">)</span>
            <span class="k">raise</span> <span class="ne">SyntaxError</span><span class="p">(</span><span class="s2">&quot;unknown data organization&quot;</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">&#39;icc_profile&#39;</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">&quot;P&quot;</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">&quot;RGB;L&quot;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&quot;&quot;</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 =&gt; rawmode, byteorder, photometrics,</span>
    <span class="c1">#           sampleformat, bitspersample, extra</span>
    <span class="s2">&quot;1&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;1&quot;</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">&quot;L&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;L&quot;</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">&quot;LA&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;LA&quot;</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">&quot;P&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;P&quot;</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">&quot;PA&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;PA&quot;</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">&quot;I&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;I;32S&quot;</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">&quot;I;16&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;I;16&quot;</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">&quot;I;16S&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;I;16S&quot;</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">&quot;F&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;F;32F&quot;</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">&quot;RGB&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;RGB&quot;</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">&quot;RGBX&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;RGBX&quot;</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">&quot;RGBA&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;RGBA&quot;</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">&quot;CMYK&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;CMYK&quot;</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">&quot;YCbCr&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;YCbCr&quot;</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">&quot;LAB&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;LAB&quot;</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">&quot;I;32BS&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;I;32BS&quot;</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">&quot;I;16B&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;I;16B&quot;</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">&quot;I;16BS&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;I;16BS&quot;</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">&quot;F;32BF&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;F;32BF&quot;</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">&quot;cannot write mode </span><span class="si">%s</span><span class="s2"> as TIFF&quot;</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">&#39;compression&#39;</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">&#39;compression&#39;</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">&#39;raw&#39;</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">&#39;raw&#39;</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">&#39;_planar_configuration&#39;</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">&quot;tiffinfo&quot;</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">&quot;Tiffinfo Keys: </span><span class="si">%s</span><span class="s2">&quot;</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">&#39;tag_v2&#39;</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">&quot;icc_profile&quot;</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">&quot;icc_profile&quot;</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">&quot;description&quot;</span><span class="p">),</span>
                      <span class="p">(</span><span class="n">X_RESOLUTION</span><span class="p">,</span> <span class="s2">&quot;resolution&quot;</span><span class="p">),</span>
                      <span class="p">(</span><span class="n">Y_RESOLUTION</span><span class="p">,</span> <span class="s2">&quot;resolution&quot;</span><span class="p">),</span>
                      <span class="p">(</span><span class="n">X_RESOLUTION</span><span class="p">,</span> <span class="s2">&quot;x_resolution&quot;</span><span class="p">),</span>
                      <span class="p">(</span><span class="n">Y_RESOLUTION</span><span class="p">,</span> <span class="s2">&quot;y_resolution&quot;</span><span class="p">),</span>
                      <span class="p">(</span><span class="n">RESOLUTION_UNIT</span><span class="p">,</span> <span class="s2">&quot;resolution_unit&quot;</span><span class="p">),</span>
                      <span class="p">(</span><span class="n">SOFTWARE</span><span class="p">,</span> <span class="s2">&quot;software&quot;</span><span class="p">),</span>
                      <span class="p">(</span><span class="n">DATE_TIME</span><span class="p">,</span> <span class="s2">&quot;date_time&quot;</span><span class="p">),</span>
                      <span class="p">(</span><span class="n">ARTIST</span><span class="p">,</span> <span class="s2">&quot;artist&quot;</span><span class="p">),</span>
                      <span class="p">(</span><span class="n">COPYRIGHT</span><span class="p">,</span> <span class="s2">&quot;copyright&quot;</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">&quot;dpi&quot;</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">&quot;P&quot;</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">&quot;RGB&quot;</span><span class="p">,</span> <span class="s2">&quot;RGB;L&quot;</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">&quot;Saving using libtiff encoder&quot;</span><span class="p">)</span>
            <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Items: </span><span class="si">%s</span><span class="s2">&quot;</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">&quot;fileno&quot;</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(&#39;&#39;)) == 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">&#39;tag&#39;</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">&#39;tag_v2&#39;</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">&lt;</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">&quot;4.0&quot;</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">&#39;ascii&#39;</span><span class="p">,</span> <span class="s1">&#39;replace&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="sa">b</span><span class="s2">&quot;</span><span class="se">\0</span><span class="s2">&quot;</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">&quot;Converted items: </span><span class="si">%s</span><span class="s2">&quot;</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&#39;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">&#39;I;16B&#39;</span><span class="p">,</span> <span class="s1">&#39;I;16&#39;</span><span class="p">):</span>
            <span class="n">rawmode</span> <span class="o">=</span> <span class="s1">&#39;I;16N&#39;</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">&#39;libtiff&#39;</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">&lt;</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">&quot;encoder error </span><span class="si">%d</span><span class="s2"> when writing image file&quot;</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">&quot;raw&quot;</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">&quot;_debug_multipage&quot;</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">&#39;read&#39;</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">&quot;w+b&quot;</span> <span class="k">if</span> <span class="n">new</span> <span class="k">else</span> <span class="s2">&quot;r+b&quot;</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">&quot;w+b&quot;</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">&quot;II</span><span class="se">\x2a\x00</span><span class="s2">&quot;</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">&quot;&lt;&quot;</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">&quot;MM</span><span class="se">\x00\x2a</span><span class="s2">&quot;</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">&quot;&gt;&quot;</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">&quot;Invalid TIFF file header&quot;</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(&quot;nothing written into new page&quot;)</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">&quot;IIMM of new page doesn&#39;t match IIMM of &quot;</span>
                               <span class="s2">&quot;first page&quot;</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">&lt;</span> <span class="n">padBytes</span> <span class="o">&lt;</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">&quot;L&quot;</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">&quot;H&quot;</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">&quot;HHL&quot;</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">&quot;wrote only </span><span class="si">%u</span><span class="s2"> bytes but wanted 4&quot;</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">&quot;wrote only </span><span class="si">%u</span><span class="s2"> bytes but wanted 2&quot;</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">&quot;wrote only </span><span class="si">%u</span><span class="s2"> bytes but wanted 4&quot;</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">&quot;wrote only </span><span class="si">%u</span><span class="s2"> bytes but wanted 2&quot;</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">&quot;wrote only </span><span class="si">%u</span><span class="s2"> bytes but wanted 4&quot;</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">&lt;=</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">&quot;offset is neither short nor long&quot;</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">&gt;=</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">&quot;not implemented&quot;</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">&quot;append_images&quot;</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">&quot;n_frames&quot;</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">&quot;n_frames&quot;</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">&quot;.tif&quot;</span><span class="p">,</span> <span class="s2">&quot;.tiff&quot;</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">&quot;image/tiff&quot;</span><span class="p">)</span>
</pre></div>

           </div>
           
          </div>
          <footer>
  

  <hr/>

  <div role="contentinfo">
    <p>
        &copy; 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>