<!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.ImageCms — Pillow (PIL Fork) 5.4.1 documentation</title> <script type="text/javascript" src="../../_static/js/modernizr.min.js"></script> <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script> <script type="text/javascript" src="../../_static/jquery.js"></script> <script type="text/javascript" src="../../_static/underscore.js"></script> <script type="text/javascript" src="../../_static/doctools.js"></script> <script type="text/javascript" src="../../_static/language_data.js"></script> <script type="text/javascript" src="../../_static/js/script.js"></script> <script type="text/javascript" src="../../_static/js/theme.js"></script> <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> <link rel="author" title="About these documents" href="../../about.html" /> <link rel="index" title="Index" href="../../genindex.html" /> <link rel="search" title="Search" href="../../search.html" /> </head> <body class="wy-body-for-nav"> <div class="wy-grid-for-nav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side"> <div class="wy-side-scroll"> <div class="wy-side-nav-search" > <a href="../../index.html" class="icon icon-home"> Pillow (PIL Fork) </a> <div class="version"> 5.4.1 </div> <div role="search"> <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get"> <input type="text" name="q" placeholder="Search docs" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> </div> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> <ul> <li class="toctree-l1"><a class="reference internal" href="../../installation.html">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="../../handbook/index.html">Handbook</a></li> <li class="toctree-l1"><a class="reference internal" href="../../reference/index.html">Reference</a></li> <li class="toctree-l1"><a class="reference internal" href="../../porting.html">Porting</a></li> <li class="toctree-l1"><a class="reference internal" href="../../about.html">About</a></li> <li class="toctree-l1"><a class="reference internal" href="../../releasenotes/index.html">Release Notes</a></li> <li class="toctree-l1"><a class="reference internal" href="../../deprecations.html">Deprecations and removals</a></li> </ul> </div> </div> </nav> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <nav class="wy-nav-top" aria-label="top navigation"> <i data-toggle="wy-nav-top" class="fa fa-bars"></i> <a href="../../index.html">Pillow (PIL Fork)</a> </nav> <div class="wy-nav-content"> <div class="rst-content"> <div role="navigation" aria-label="breadcrumbs navigation"> <ul class="wy-breadcrumbs"> <li><a href="../../index.html">Docs</a> »</li> <li><a href="../index.html">Module code</a> »</li> <li>PIL.ImageCms</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.ImageCms</h1><div class="highlight"><pre> <span></span><span class="c1"># The Python Imaging Library.</span> <span class="c1"># $Id$</span> <span class="c1"># Optional color management support, based on Kevin Cazabon's PyCMS</span> <span class="c1"># library.</span> <span class="c1"># History:</span> <span class="c1"># 2009-03-08 fl Added to PIL.</span> <span class="c1"># Copyright (C) 2002-2003 Kevin Cazabon</span> <span class="c1"># Copyright (c) 2009 by Fredrik Lundh</span> <span class="c1"># Copyright (c) 2013 by Eric Soroos</span> <span class="c1"># See the README file for information on usage and redistribution. See</span> <span class="c1"># below for the original description.</span> <span class="kn">from</span> <span class="nn">__future__</span> <span class="k">import</span> <span class="n">print_function</span> <span class="kn">import</span> <span class="nn">sys</span> <span class="kn">from</span> <span class="nn">PIL</span> <span class="k">import</span> <span class="n">Image</span> <span class="k">try</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">PIL</span> <span class="k">import</span> <span class="n">_imagingcms</span> <span class="k">except</span> <span class="ne">ImportError</span> <span class="k">as</span> <span class="n">ex</span><span class="p">:</span> <span class="c1"># Allow error import for doc purposes, but error out when accessing</span> <span class="c1"># anything in core.</span> <span class="kn">from</span> <span class="nn">_util</span> <span class="k">import</span> <span class="n">deferred_error</span> <span class="n">_imagingcms</span> <span class="o">=</span> <span class="n">deferred_error</span><span class="p">(</span><span class="n">ex</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">PIL._util</span> <span class="k">import</span> <span class="n">isStringType</span> <span class="n">DESCRIPTION</span> <span class="o">=</span> <span class="s2">"""</span> <span class="s2">pyCMS</span> <span class="s2"> a Python / PIL interface to the littleCMS ICC Color Management System</span> <span class="s2"> Copyright (C) 2002-2003 Kevin Cazabon</span> <span class="s2"> kevin@cazabon.com</span> <span class="s2"> http://www.cazabon.com</span> <span class="s2"> pyCMS home page: http://www.cazabon.com/pyCMS</span> <span class="s2"> littleCMS home page: http://www.littlecms.com</span> <span class="s2"> (littleCMS is Copyright (C) 1998-2001 Marti Maria)</span> <span class="s2"> Originally released under LGPL. Graciously donated to PIL in</span> <span class="s2"> March 2009, for distribution under the standard PIL license</span> <span class="s2"> The pyCMS.py module provides a "clean" interface between Python/PIL and</span> <span class="s2"> pyCMSdll, taking care of some of the more complex handling of the direct</span> <span class="s2"> pyCMSdll functions, as well as error-checking and making sure that all</span> <span class="s2"> relevant data is kept together.</span> <span class="s2"> While it is possible to call pyCMSdll functions directly, it's not highly</span> <span class="s2"> recommended.</span> <span class="s2"> Version History:</span> <span class="s2"> 1.0.0 pil Oct 2013 Port to LCMS 2.</span> <span class="s2"> 0.1.0 pil mod March 10, 2009</span> <span class="s2"> Renamed display profile to proof profile. The proof</span> <span class="s2"> profile is the profile of the device that is being</span> <span class="s2"> simulated, not the profile of the device which is</span> <span class="s2"> actually used to display/print the final simulation</span> <span class="s2"> (that'd be the output profile) - also see LCMSAPI.txt</span> <span class="s2"> input colorspace -> using 'renderingIntent' -> proof</span> <span class="s2"> colorspace -> using 'proofRenderingIntent' -> output</span> <span class="s2"> colorspace</span> <span class="s2"> Added LCMS FLAGS support.</span> <span class="s2"> Added FLAGS["SOFTPROOFING"] as default flag for</span> <span class="s2"> buildProofTransform (otherwise the proof profile/intent</span> <span class="s2"> would be ignored).</span> <span class="s2"> 0.1.0 pil March 2009 - added to PIL, as PIL.ImageCms</span> <span class="s2"> 0.0.2 alpha Jan 6, 2002</span> <span class="s2"> Added try/except statements around type() checks of</span> <span class="s2"> potential CObjects... Python won't let you use type()</span> <span class="s2"> on them, and raises a TypeError (stupid, if you ask</span> <span class="s2"> me!)</span> <span class="s2"> Added buildProofTransformFromOpenProfiles() function.</span> <span class="s2"> Additional fixes in DLL, see DLL code for details.</span> <span class="s2"> 0.0.1 alpha first public release, Dec. 26, 2002</span> <span class="s2"> Known to-do list with current version (of Python interface, not pyCMSdll):</span> <span class="s2"> none</span> <span class="s2">"""</span> <span class="n">VERSION</span> <span class="o">=</span> <span class="s2">"1.0.0 pil"</span> <span class="c1"># --------------------------------------------------------------------.</span> <span class="n">core</span> <span class="o">=</span> <span class="n">_imagingcms</span> <span class="c1">#</span> <span class="c1"># intent/direction values</span> <span class="n">INTENT_PERCEPTUAL</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">INTENT_RELATIVE_COLORIMETRIC</span> <span class="o">=</span> <span class="mi">1</span> <span class="n">INTENT_SATURATION</span> <span class="o">=</span> <span class="mi">2</span> <span class="n">INTENT_ABSOLUTE_COLORIMETRIC</span> <span class="o">=</span> <span class="mi">3</span> <span class="n">DIRECTION_INPUT</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">DIRECTION_OUTPUT</span> <span class="o">=</span> <span class="mi">1</span> <span class="n">DIRECTION_PROOF</span> <span class="o">=</span> <span class="mi">2</span> <span class="c1">#</span> <span class="c1"># flags</span> <span class="n">FLAGS</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"MATRIXINPUT"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">"MATRIXOUTPUT"</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s2">"MATRIXONLY"</span><span class="p">:</span> <span class="p">(</span><span class="mi">1</span> <span class="o">|</span> <span class="mi">2</span><span class="p">),</span> <span class="s2">"NOWHITEONWHITEFIXUP"</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span> <span class="c1"># Don't hot fix scum dot</span> <span class="c1"># Don't create prelinearization tables on precalculated transforms</span> <span class="c1"># (internal use):</span> <span class="s2">"NOPRELINEARIZATION"</span><span class="p">:</span> <span class="mi">16</span><span class="p">,</span> <span class="s2">"GUESSDEVICECLASS"</span><span class="p">:</span> <span class="mi">32</span><span class="p">,</span> <span class="c1"># Guess device class (for transform2devicelink)</span> <span class="s2">"NOTCACHE"</span><span class="p">:</span> <span class="mi">64</span><span class="p">,</span> <span class="c1"># Inhibit 1-pixel cache</span> <span class="s2">"NOTPRECALC"</span><span class="p">:</span> <span class="mi">256</span><span class="p">,</span> <span class="s2">"NULLTRANSFORM"</span><span class="p">:</span> <span class="mi">512</span><span class="p">,</span> <span class="c1"># Don't transform anyway</span> <span class="s2">"HIGHRESPRECALC"</span><span class="p">:</span> <span class="mi">1024</span><span class="p">,</span> <span class="c1"># Use more memory to give better accuracy</span> <span class="s2">"LOWRESPRECALC"</span><span class="p">:</span> <span class="mi">2048</span><span class="p">,</span> <span class="c1"># Use less memory to minimize resources</span> <span class="s2">"WHITEBLACKCOMPENSATION"</span><span class="p">:</span> <span class="mi">8192</span><span class="p">,</span> <span class="s2">"BLACKPOINTCOMPENSATION"</span><span class="p">:</span> <span class="mi">8192</span><span class="p">,</span> <span class="s2">"GAMUTCHECK"</span><span class="p">:</span> <span class="mi">4096</span><span class="p">,</span> <span class="c1"># Out of Gamut alarm</span> <span class="s2">"SOFTPROOFING"</span><span class="p">:</span> <span class="mi">16384</span><span class="p">,</span> <span class="c1"># Do softproofing</span> <span class="s2">"PRESERVEBLACK"</span><span class="p">:</span> <span class="mi">32768</span><span class="p">,</span> <span class="c1"># Black preservation</span> <span class="s2">"NODEFAULTRESOURCEDEF"</span><span class="p">:</span> <span class="mi">16777216</span><span class="p">,</span> <span class="c1"># CRD special</span> <span class="s2">"GRIDPOINTS"</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="p">((</span><span class="n">n</span><span class="p">)</span> <span class="o">&</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="o"><<</span> <span class="mi">16</span> <span class="c1"># Gridpoints</span> <span class="p">}</span> <span class="n">_MAX_FLAG</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">flag</span> <span class="ow">in</span> <span class="n">FLAGS</span><span class="o">.</span><span class="n">values</span><span class="p">():</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">flag</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span> <span class="n">_MAX_FLAG</span> <span class="o">=</span> <span class="n">_MAX_FLAG</span> <span class="o">|</span> <span class="n">flag</span> <span class="c1"># --------------------------------------------------------------------.</span> <span class="c1"># Experimental PIL-level API</span> <span class="c1"># --------------------------------------------------------------------.</span> <span class="c1">##</span> <span class="c1"># Profile.</span> <span class="k">class</span> <span class="nc">ImageCmsProfile</span><span class="p">(</span><span class="nb">object</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">profile</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> :param profile: Either a string representing a filename,</span> <span class="sd"> a file like object containing a profile or a</span> <span class="sd"> low-level profile object</span> <span class="sd"> """</span> <span class="k">if</span> <span class="n">isStringType</span><span class="p">(</span><span class="n">profile</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="p">(</span><span class="n">core</span><span class="o">.</span><span class="n">profile_open</span><span class="p">(</span><span class="n">profile</span><span class="p">),</span> <span class="n">profile</span><span class="p">)</span> <span class="k">elif</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">profile</span><span class="p">,</span> <span class="s2">"read"</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="p">(</span><span class="n">core</span><span class="o">.</span><span class="n">profile_frombytes</span><span class="p">(</span><span class="n">profile</span><span class="o">.</span><span class="n">read</span><span class="p">()))</span> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">profile</span><span class="p">,</span> <span class="n">_imagingcms</span><span class="o">.</span><span class="n">CmsProfile</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="p">(</span><span class="n">profile</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"Invalid type for Profile"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">profile</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">profile</span> <span class="o">=</span> <span class="n">profile</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span> <span class="k">if</span> <span class="n">profile</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">product_name</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># profile.product_name</span> <span class="bp">self</span><span class="o">.</span><span class="n">product_info</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># profile.product_info</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">product_name</span> <span class="o">=</span> <span class="kc">None</span> <span class="bp">self</span><span class="o">.</span><span class="n">product_info</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">def</span> <span class="nf">tobytes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Returns the profile in a format suitable for embedding in</span> <span class="sd"> saved images.</span> <span class="sd"> :returns: a bytes object containing the ICC profile.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="n">core</span><span class="o">.</span><span class="n">profile_tobytes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">profile</span><span class="p">)</span> <div class="viewcode-block" id="ImageCmsTransform"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.ImageCmsTransform">[docs]</a><span class="k">class</span> <span class="nc">ImageCmsTransform</span><span class="p">(</span><span class="n">Image</span><span class="o">.</span><span class="n">ImagePointHandler</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Transform. This can be used with the procedural API, or with the standard</span> <span class="sd"> Image.point() method.</span> <span class="sd"> Will return the output profile in the output.info['icc_profile'].</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">,</span> <span class="n">output</span><span class="p">,</span> <span class="n">input_mode</span><span class="p">,</span> <span class="n">output_mode</span><span class="p">,</span> <span class="n">intent</span><span class="o">=</span><span class="n">INTENT_PERCEPTUAL</span><span class="p">,</span> <span class="n">proof</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">proof_intent</span><span class="o">=</span><span class="n">INTENT_ABSOLUTE_COLORIMETRIC</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span> <span class="k">if</span> <span class="n">proof</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">transform</span> <span class="o">=</span> <span class="n">core</span><span class="o">.</span><span class="n">buildTransform</span><span class="p">(</span> <span class="nb">input</span><span class="o">.</span><span class="n">profile</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">profile</span><span class="p">,</span> <span class="n">input_mode</span><span class="p">,</span> <span class="n">output_mode</span><span class="p">,</span> <span class="n">intent</span><span class="p">,</span> <span class="n">flags</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">transform</span> <span class="o">=</span> <span class="n">core</span><span class="o">.</span><span class="n">buildProofTransform</span><span class="p">(</span> <span class="nb">input</span><span class="o">.</span><span class="n">profile</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">profile</span><span class="p">,</span> <span class="n">proof</span><span class="o">.</span><span class="n">profile</span><span class="p">,</span> <span class="n">input_mode</span><span class="p">,</span> <span class="n">output_mode</span><span class="p">,</span> <span class="n">intent</span><span class="p">,</span> <span class="n">proof_intent</span><span class="p">,</span> <span class="n">flags</span> <span class="p">)</span> <span class="c1"># Note: inputMode and outputMode are for pyCMS compatibility only</span> <span class="bp">self</span><span class="o">.</span><span class="n">input_mode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">inputMode</span> <span class="o">=</span> <span class="n">input_mode</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_mode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">outputMode</span> <span class="o">=</span> <span class="n">output_mode</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_profile</span> <span class="o">=</span> <span class="n">output</span> <span class="k">def</span> <span class="nf">point</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">im</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="n">im</span><span class="p">)</span> <span class="k">def</span> <span class="nf">apply</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">im</span><span class="p">,</span> <span class="n">imOut</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="n">im</span><span class="o">.</span><span class="n">load</span><span class="p">()</span> <span class="k">if</span> <span class="n">imOut</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">imOut</span> <span class="o">=</span> <span class="n">Image</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">output_mode</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="kc">None</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">transform</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="n">im</span><span class="o">.</span><span class="n">im</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">imOut</span><span class="o">.</span><span class="n">im</span><span class="o">.</span><span class="n">id</span><span class="p">)</span> <span class="n">imOut</span><span class="o">.</span><span class="n">info</span><span class="p">[</span><span class="s1">'icc_profile'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_profile</span><span class="o">.</span><span class="n">tobytes</span><span class="p">()</span> <span class="k">return</span> <span class="n">imOut</span> <span class="k">def</span> <span class="nf">apply_in_place</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">im</span><span class="p">):</span> <span class="n">im</span><span class="o">.</span><span class="n">load</span><span class="p">()</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="bp">self</span><span class="o">.</span><span class="n">output_mode</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"mode mismatch"</span><span class="p">)</span> <span class="c1"># wrong output mode</span> <span class="bp">self</span><span class="o">.</span><span class="n">transform</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="n">im</span><span class="o">.</span><span class="n">im</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">im</span><span class="o">.</span><span class="n">im</span><span class="o">.</span><span class="n">id</span><span class="p">)</span> <span class="n">im</span><span class="o">.</span><span class="n">info</span><span class="p">[</span><span class="s1">'icc_profile'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_profile</span><span class="o">.</span><span class="n">tobytes</span><span class="p">()</span> <span class="k">return</span> <span class="n">im</span></div> <div class="viewcode-block" id="get_display_profile"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.get_display_profile">[docs]</a><span class="k">def</span> <span class="nf">get_display_profile</span><span class="p">(</span><span class="n">handle</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="sd">""" (experimental) Fetches the profile for the current display device.</span> <span class="sd"> :returns: None if the profile is not known.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">platform</span> <span class="o">==</span> <span class="s2">"win32"</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">PIL</span> <span class="k">import</span> <span class="n">ImageWin</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">ImageWin</span><span class="o">.</span><span class="n">HDC</span><span class="p">):</span> <span class="n">profile</span> <span class="o">=</span> <span class="n">core</span><span class="o">.</span><span class="n">get_display_profile_win32</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">profile</span> <span class="o">=</span> <span class="n">core</span><span class="o">.</span><span class="n">get_display_profile_win32</span><span class="p">(</span><span class="n">handle</span> <span class="ow">or</span> <span class="mi">0</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">get</span> <span class="o">=</span> <span class="n">_imagingcms</span><span class="o">.</span><span class="n">get_display_profile</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">return</span> <span class="kc">None</span> <span class="k">else</span><span class="p">:</span> <span class="n">profile</span> <span class="o">=</span> <span class="n">get</span><span class="p">()</span> <span class="k">return</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">profile</span><span class="p">)</span></div> <span class="c1"># --------------------------------------------------------------------.</span> <span class="c1"># pyCMS compatible layer</span> <span class="c1"># --------------------------------------------------------------------.</span> <div class="viewcode-block" id="PyCMSError"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.PyCMSError">[docs]</a><span class="k">class</span> <span class="nc">PyCMSError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span> <span class="sd">""" (pyCMS) Exception class.</span> <span class="sd"> This is used for all errors in the pyCMS API. """</span> <span class="k">pass</span></div> <div class="viewcode-block" id="profileToProfile"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.profileToProfile">[docs]</a><span class="k">def</span> <span class="nf">profileToProfile</span><span class="p">(</span> <span class="n">im</span><span class="p">,</span> <span class="n">inputProfile</span><span class="p">,</span> <span class="n">outputProfile</span><span class="p">,</span> <span class="n">renderingIntent</span><span class="o">=</span><span class="n">INTENT_PERCEPTUAL</span><span class="p">,</span> <span class="n">outputMode</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">inPlace</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Applies an ICC transformation to a given image, mapping from</span> <span class="sd"> inputProfile to outputProfile.</span> <span class="sd"> If the input or output profiles specified are not valid filenames, a</span> <span class="sd"> PyCMSError will be raised. If inPlace == TRUE and outputMode != im.mode,</span> <span class="sd"> a PyCMSError will be raised. If an error occurs during application of</span> <span class="sd"> the profiles, a PyCMSError will be raised. If outputMode is not a mode</span> <span class="sd"> supported by the outputProfile (or by pyCMS), a PyCMSError will be</span> <span class="sd"> raised.</span> <span class="sd"> This function applies an ICC transformation to im from inputProfile's</span> <span class="sd"> color space to outputProfile's color space using the specified rendering</span> <span class="sd"> intent to decide how to handle out-of-gamut colors.</span> <span class="sd"> OutputMode can be used to specify that a color mode conversion is to</span> <span class="sd"> be done using these profiles, but the specified profiles must be able</span> <span class="sd"> to handle that mode. I.e., if converting im from RGB to CMYK using</span> <span class="sd"> profiles, the input profile must handle RGB data, and the output</span> <span class="sd"> profile must handle CMYK data.</span> <span class="sd"> :param im: An open PIL image object (i.e. Image.new(...) or</span> <span class="sd"> Image.open(...), etc.)</span> <span class="sd"> :param inputProfile: String, as a valid filename path to the ICC input</span> <span class="sd"> profile you wish to use for this image, or a profile object</span> <span class="sd"> :param outputProfile: String, as a valid filename path to the ICC output</span> <span class="sd"> profile you wish to use for this image, or a profile object</span> <span class="sd"> :param renderingIntent: Integer (0-3) specifying the rendering intent you</span> <span class="sd"> wish to use for the transform</span> <span class="sd"> ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT)</span> <span class="sd"> ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1</span> <span class="sd"> ImageCms.INTENT_SATURATION = 2</span> <span class="sd"> ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3</span> <span class="sd"> see the pyCMS documentation for details on rendering intents and what</span> <span class="sd"> they do.</span> <span class="sd"> :param outputMode: A valid PIL mode for the output image (i.e. "RGB",</span> <span class="sd"> "CMYK", etc.). Note: if rendering the image "inPlace", outputMode</span> <span class="sd"> MUST be the same mode as the input, or omitted completely. If</span> <span class="sd"> omitted, the outputMode will be the same as the mode of the input</span> <span class="sd"> image (im.mode)</span> <span class="sd"> :param inPlace: Boolean (1 = True, None or 0 = False). If True, the</span> <span class="sd"> original image is modified in-place, and None is returned. If False</span> <span class="sd"> (default), a new Image object is returned with the transform applied.</span> <span class="sd"> :param flags: Integer (0-...) specifying additional flags</span> <span class="sd"> :returns: Either None or a new PIL image object, depending on value of</span> <span class="sd"> inPlace</span> <span class="sd"> :exception PyCMSError:</span> <span class="sd"> """</span> <span class="k">if</span> <span class="n">outputMode</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">outputMode</span> <span class="o">=</span> <span class="n">im</span><span class="o">.</span><span class="n">mode</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">renderingIntent</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">0</span> <span class="o"><=</span> <span class="n">renderingIntent</span> <span class="o"><=</span> <span class="mi">3</span><span class="p">):</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="s2">"renderingIntent must be an integer between 0 and 3"</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">flags</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">0</span> <span class="o"><=</span> <span class="n">flags</span> <span class="o"><=</span> <span class="n">_MAX_FLAG</span><span class="p">):</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span> <span class="s2">"flags must be an integer between 0 and </span><span class="si">%s</span><span class="s2">"</span> <span class="o">+</span> <span class="n">_MAX_FLAG</span><span class="p">)</span> <span class="k">try</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">inputProfile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">inputProfile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">inputProfile</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">outputProfile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">outputProfile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">outputProfile</span><span class="p">)</span> <span class="n">transform</span> <span class="o">=</span> <span class="n">ImageCmsTransform</span><span class="p">(</span> <span class="n">inputProfile</span><span class="p">,</span> <span class="n">outputProfile</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="n">outputMode</span><span class="p">,</span> <span class="n">renderingIntent</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">flags</span> <span class="p">)</span> <span class="k">if</span> <span class="n">inPlace</span><span class="p">:</span> <span class="n">transform</span><span class="o">.</span><span class="n">apply_in_place</span><span class="p">(</span><span class="n">im</span><span class="p">)</span> <span class="n">imOut</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">else</span><span class="p">:</span> <span class="n">imOut</span> <span class="o">=</span> <span class="n">transform</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="n">im</span><span class="p">)</span> <span class="k">except</span> <span class="p">(</span><span class="ne">IOError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">return</span> <span class="n">imOut</span></div> <div class="viewcode-block" id="getOpenProfile"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.getOpenProfile">[docs]</a><span class="k">def</span> <span class="nf">getOpenProfile</span><span class="p">(</span><span class="n">profileFilename</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Opens an ICC profile file.</span> <span class="sd"> The PyCMSProfile object can be passed back into pyCMS for use in creating</span> <span class="sd"> transforms and such (as in ImageCms.buildTransformFromOpenProfiles()).</span> <span class="sd"> If profileFilename is not a valid filename for an ICC profile, a PyCMSError</span> <span class="sd"> will be raised.</span> <span class="sd"> :param profileFilename: String, as a valid filename path to the ICC profile</span> <span class="sd"> you wish to open, or a file-like object.</span> <span class="sd"> :returns: A CmsProfile class object.</span> <span class="sd"> :exception PyCMSError:</span> <span class="sd"> """</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">profileFilename</span><span class="p">)</span> <span class="k">except</span> <span class="p">(</span><span class="ne">IOError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="n">v</span><span class="p">)</span></div> <div class="viewcode-block" id="buildTransform"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.buildTransform">[docs]</a><span class="k">def</span> <span class="nf">buildTransform</span><span class="p">(</span> <span class="n">inputProfile</span><span class="p">,</span> <span class="n">outputProfile</span><span class="p">,</span> <span class="n">inMode</span><span class="p">,</span> <span class="n">outMode</span><span class="p">,</span> <span class="n">renderingIntent</span><span class="o">=</span><span class="n">INTENT_PERCEPTUAL</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Builds an ICC transform mapping from the inputProfile to the</span> <span class="sd"> outputProfile. Use applyTransform to apply the transform to a given</span> <span class="sd"> image.</span> <span class="sd"> If the input or output profiles specified are not valid filenames, a</span> <span class="sd"> PyCMSError will be raised. If an error occurs during creation of the</span> <span class="sd"> transform, a PyCMSError will be raised.</span> <span class="sd"> If inMode or outMode are not a mode supported by the outputProfile (or</span> <span class="sd"> by pyCMS), a PyCMSError will be raised.</span> <span class="sd"> This function builds and returns an ICC transform from the inputProfile</span> <span class="sd"> to the outputProfile using the renderingIntent to determine what to do</span> <span class="sd"> with out-of-gamut colors. It will ONLY work for converting images that</span> <span class="sd"> are in inMode to images that are in outMode color format (PIL mode,</span> <span class="sd"> i.e. "RGB", "RGBA", "CMYK", etc.).</span> <span class="sd"> Building the transform is a fair part of the overhead in</span> <span class="sd"> ImageCms.profileToProfile(), so if you're planning on converting multiple</span> <span class="sd"> images using the same input/output settings, this can save you time.</span> <span class="sd"> Once you have a transform object, it can be used with</span> <span class="sd"> ImageCms.applyProfile() to convert images without the need to re-compute</span> <span class="sd"> the lookup table for the transform.</span> <span class="sd"> The reason pyCMS returns a class object rather than a handle directly</span> <span class="sd"> to the transform is that it needs to keep track of the PIL input/output</span> <span class="sd"> modes that the transform is meant for. These attributes are stored in</span> <span class="sd"> the "inMode" and "outMode" attributes of the object (which can be</span> <span class="sd"> manually overridden if you really want to, but I don't know of any</span> <span class="sd"> time that would be of use, or would even work).</span> <span class="sd"> :param inputProfile: String, as a valid filename path to the ICC input</span> <span class="sd"> profile you wish to use for this transform, or a profile object</span> <span class="sd"> :param outputProfile: String, as a valid filename path to the ICC output</span> <span class="sd"> profile you wish to use for this transform, or a profile object</span> <span class="sd"> :param inMode: String, as a valid PIL mode that the appropriate profile</span> <span class="sd"> also supports (i.e. "RGB", "RGBA", "CMYK", etc.)</span> <span class="sd"> :param outMode: String, as a valid PIL mode that the appropriate profile</span> <span class="sd"> also supports (i.e. "RGB", "RGBA", "CMYK", etc.)</span> <span class="sd"> :param renderingIntent: Integer (0-3) specifying the rendering intent you</span> <span class="sd"> wish to use for the transform</span> <span class="sd"> ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT)</span> <span class="sd"> ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1</span> <span class="sd"> ImageCms.INTENT_SATURATION = 2</span> <span class="sd"> ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3</span> <span class="sd"> see the pyCMS documentation for details on rendering intents and what</span> <span class="sd"> they do.</span> <span class="sd"> :param flags: Integer (0-...) specifying additional flags</span> <span class="sd"> :returns: A CmsTransform class object.</span> <span class="sd"> :exception PyCMSError:</span> <span class="sd"> """</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">renderingIntent</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">0</span> <span class="o"><=</span> <span class="n">renderingIntent</span> <span class="o"><=</span> <span class="mi">3</span><span class="p">):</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="s2">"renderingIntent must be an integer between 0 and 3"</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">flags</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">0</span> <span class="o"><=</span> <span class="n">flags</span> <span class="o"><=</span> <span class="n">_MAX_FLAG</span><span class="p">):</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span> <span class="s2">"flags must be an integer between 0 and </span><span class="si">%s</span><span class="s2">"</span> <span class="o">+</span> <span class="n">_MAX_FLAG</span><span class="p">)</span> <span class="k">try</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">inputProfile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">inputProfile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">inputProfile</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">outputProfile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">outputProfile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">outputProfile</span><span class="p">)</span> <span class="k">return</span> <span class="n">ImageCmsTransform</span><span class="p">(</span> <span class="n">inputProfile</span><span class="p">,</span> <span class="n">outputProfile</span><span class="p">,</span> <span class="n">inMode</span><span class="p">,</span> <span class="n">outMode</span><span class="p">,</span> <span class="n">renderingIntent</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">flags</span><span class="p">)</span> <span class="k">except</span> <span class="p">(</span><span class="ne">IOError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="n">v</span><span class="p">)</span></div> <div class="viewcode-block" id="buildProofTransform"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.buildProofTransform">[docs]</a><span class="k">def</span> <span class="nf">buildProofTransform</span><span class="p">(</span> <span class="n">inputProfile</span><span class="p">,</span> <span class="n">outputProfile</span><span class="p">,</span> <span class="n">proofProfile</span><span class="p">,</span> <span class="n">inMode</span><span class="p">,</span> <span class="n">outMode</span><span class="p">,</span> <span class="n">renderingIntent</span><span class="o">=</span><span class="n">INTENT_PERCEPTUAL</span><span class="p">,</span> <span class="n">proofRenderingIntent</span><span class="o">=</span><span class="n">INTENT_ABSOLUTE_COLORIMETRIC</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">FLAGS</span><span class="p">[</span><span class="s2">"SOFTPROOFING"</span><span class="p">]):</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Builds an ICC transform mapping from the inputProfile to the</span> <span class="sd"> outputProfile, but tries to simulate the result that would be</span> <span class="sd"> obtained on the proofProfile device.</span> <span class="sd"> If the input, output, or proof profiles specified are not valid</span> <span class="sd"> filenames, a PyCMSError will be raised.</span> <span class="sd"> If an error occurs during creation of the transform, a PyCMSError will</span> <span class="sd"> be raised.</span> <span class="sd"> If inMode or outMode are not a mode supported by the outputProfile</span> <span class="sd"> (or by pyCMS), a PyCMSError will be raised.</span> <span class="sd"> This function builds and returns an ICC transform from the inputProfile</span> <span class="sd"> to the outputProfile, but tries to simulate the result that would be</span> <span class="sd"> obtained on the proofProfile device using renderingIntent and</span> <span class="sd"> proofRenderingIntent to determine what to do with out-of-gamut</span> <span class="sd"> colors. This is known as "soft-proofing". It will ONLY work for</span> <span class="sd"> converting images that are in inMode to images that are in outMode</span> <span class="sd"> color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.).</span> <span class="sd"> Usage of the resulting transform object is exactly the same as with</span> <span class="sd"> ImageCms.buildTransform().</span> <span class="sd"> Proof profiling is generally used when using an output device to get a</span> <span class="sd"> good idea of what the final printed/displayed image would look like on</span> <span class="sd"> the proofProfile device when it's quicker and easier to use the</span> <span class="sd"> output device for judging color. Generally, this means that the</span> <span class="sd"> output device is a monitor, or a dye-sub printer (etc.), and the simulated</span> <span class="sd"> device is something more expensive, complicated, or time consuming</span> <span class="sd"> (making it difficult to make a real print for color judgement purposes).</span> <span class="sd"> Soft-proofing basically functions by adjusting the colors on the</span> <span class="sd"> output device to match the colors of the device being simulated. However,</span> <span class="sd"> when the simulated device has a much wider gamut than the output</span> <span class="sd"> device, you may obtain marginal results.</span> <span class="sd"> :param inputProfile: String, as a valid filename path to the ICC input</span> <span class="sd"> profile you wish to use for this transform, or a profile object</span> <span class="sd"> :param outputProfile: String, as a valid filename path to the ICC output</span> <span class="sd"> (monitor, usually) profile you wish to use for this transform, or a</span> <span class="sd"> profile object</span> <span class="sd"> :param proofProfile: String, as a valid filename path to the ICC proof</span> <span class="sd"> profile you wish to use for this transform, or a profile object</span> <span class="sd"> :param inMode: String, as a valid PIL mode that the appropriate profile</span> <span class="sd"> also supports (i.e. "RGB", "RGBA", "CMYK", etc.)</span> <span class="sd"> :param outMode: String, as a valid PIL mode that the appropriate profile</span> <span class="sd"> also supports (i.e. "RGB", "RGBA", "CMYK", etc.)</span> <span class="sd"> :param renderingIntent: Integer (0-3) specifying the rendering intent you</span> <span class="sd"> wish to use for the input->proof (simulated) transform</span> <span class="sd"> ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT)</span> <span class="sd"> ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1</span> <span class="sd"> ImageCms.INTENT_SATURATION = 2</span> <span class="sd"> ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3</span> <span class="sd"> see the pyCMS documentation for details on rendering intents and what</span> <span class="sd"> they do.</span> <span class="sd"> :param proofRenderingIntent: Integer (0-3) specifying the rendering intent</span> <span class="sd"> you wish to use for proof->output transform</span> <span class="sd"> ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT)</span> <span class="sd"> ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1</span> <span class="sd"> ImageCms.INTENT_SATURATION = 2</span> <span class="sd"> ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3</span> <span class="sd"> see the pyCMS documentation for details on rendering intents and what</span> <span class="sd"> they do.</span> <span class="sd"> :param flags: Integer (0-...) specifying additional flags</span> <span class="sd"> :returns: A CmsTransform class object.</span> <span class="sd"> :exception PyCMSError:</span> <span class="sd"> """</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">renderingIntent</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">0</span> <span class="o"><=</span> <span class="n">renderingIntent</span> <span class="o"><=</span> <span class="mi">3</span><span class="p">):</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="s2">"renderingIntent must be an integer between 0 and 3"</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">flags</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">0</span> <span class="o"><=</span> <span class="n">flags</span> <span class="o"><=</span> <span class="n">_MAX_FLAG</span><span class="p">):</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span> <span class="s2">"flags must be an integer between 0 and </span><span class="si">%s</span><span class="s2">"</span> <span class="o">+</span> <span class="n">_MAX_FLAG</span><span class="p">)</span> <span class="k">try</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">inputProfile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">inputProfile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">inputProfile</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">outputProfile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">outputProfile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">outputProfile</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">proofProfile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">proofProfile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">proofProfile</span><span class="p">)</span> <span class="k">return</span> <span class="n">ImageCmsTransform</span><span class="p">(</span> <span class="n">inputProfile</span><span class="p">,</span> <span class="n">outputProfile</span><span class="p">,</span> <span class="n">inMode</span><span class="p">,</span> <span class="n">outMode</span><span class="p">,</span> <span class="n">renderingIntent</span><span class="p">,</span> <span class="n">proofProfile</span><span class="p">,</span> <span class="n">proofRenderingIntent</span><span class="p">,</span> <span class="n">flags</span><span class="p">)</span> <span class="k">except</span> <span class="p">(</span><span class="ne">IOError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="n">v</span><span class="p">)</span></div> <span class="n">buildTransformFromOpenProfiles</span> <span class="o">=</span> <span class="n">buildTransform</span> <span class="n">buildProofTransformFromOpenProfiles</span> <span class="o">=</span> <span class="n">buildProofTransform</span> <div class="viewcode-block" id="applyTransform"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.applyTransform">[docs]</a><span class="k">def</span> <span class="nf">applyTransform</span><span class="p">(</span><span class="n">im</span><span class="p">,</span> <span class="n">transform</span><span class="p">,</span> <span class="n">inPlace</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Applies a transform to a given image.</span> <span class="sd"> If im.mode != transform.inMode, a PyCMSError is raised.</span> <span class="sd"> If inPlace == TRUE and transform.inMode != transform.outMode, a</span> <span class="sd"> PyCMSError is raised.</span> <span class="sd"> If im.mode, transfer.inMode, or transfer.outMode is not supported by</span> <span class="sd"> pyCMSdll or the profiles you used for the transform, a PyCMSError is</span> <span class="sd"> raised.</span> <span class="sd"> If an error occurs while the transform is being applied, a PyCMSError</span> <span class="sd"> is raised.</span> <span class="sd"> This function applies a pre-calculated transform (from</span> <span class="sd"> ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles())</span> <span class="sd"> to an image. The transform can be used for multiple images, saving</span> <span class="sd"> considerable calculation time if doing the same conversion multiple times.</span> <span class="sd"> If you want to modify im in-place instead of receiving a new image as</span> <span class="sd"> the return value, set inPlace to TRUE. This can only be done if</span> <span class="sd"> transform.inMode and transform.outMode are the same, because we can't</span> <span class="sd"> change the mode in-place (the buffer sizes for some modes are</span> <span class="sd"> different). The default behavior is to return a new Image object of</span> <span class="sd"> the same dimensions in mode transform.outMode.</span> <span class="sd"> :param im: A PIL Image object, and im.mode must be the same as the inMode</span> <span class="sd"> supported by the transform.</span> <span class="sd"> :param transform: A valid CmsTransform class object</span> <span class="sd"> :param inPlace: Bool (1 == True, 0 or None == False). If True, im is</span> <span class="sd"> modified in place and None is returned, if False, a new Image object</span> <span class="sd"> with the transform applied is returned (and im is not changed). The</span> <span class="sd"> default is False.</span> <span class="sd"> :returns: Either None, or a new PIL Image object, depending on the value of</span> <span class="sd"> inPlace. The profile will be returned in the image's</span> <span class="sd"> info['icc_profile'].</span> <span class="sd"> :exception PyCMSError:</span> <span class="sd"> """</span> <span class="k">try</span><span class="p">:</span> <span class="k">if</span> <span class="n">inPlace</span><span class="p">:</span> <span class="n">transform</span><span class="o">.</span><span class="n">apply_in_place</span><span class="p">(</span><span class="n">im</span><span class="p">)</span> <span class="n">imOut</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">else</span><span class="p">:</span> <span class="n">imOut</span> <span class="o">=</span> <span class="n">transform</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="n">im</span><span class="p">)</span> <span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">return</span> <span class="n">imOut</span></div> <div class="viewcode-block" id="createProfile"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.createProfile">[docs]</a><span class="k">def</span> <span class="nf">createProfile</span><span class="p">(</span><span class="n">colorSpace</span><span class="p">,</span> <span class="n">colorTemp</span><span class="o">=-</span><span class="mi">1</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Creates a profile.</span> <span class="sd"> If colorSpace not in ["LAB", "XYZ", "sRGB"], a PyCMSError is raised</span> <span class="sd"> If using LAB and colorTemp != a positive integer, a PyCMSError is raised.</span> <span class="sd"> If an error occurs while creating the profile, a PyCMSError is raised.</span> <span class="sd"> Use this function to create common profiles on-the-fly instead of</span> <span class="sd"> having to supply a profile on disk and knowing the path to it. It</span> <span class="sd"> returns a normal CmsProfile object that can be passed to</span> <span class="sd"> ImageCms.buildTransformFromOpenProfiles() to create a transform to apply</span> <span class="sd"> to images.</span> <span class="sd"> :param colorSpace: String, the color space of the profile you wish to</span> <span class="sd"> create.</span> <span class="sd"> Currently only "LAB", "XYZ", and "sRGB" are supported.</span> <span class="sd"> :param colorTemp: Positive integer for the white point for the profile, in</span> <span class="sd"> degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50</span> <span class="sd"> illuminant if omitted (5000k). colorTemp is ONLY applied to LAB</span> <span class="sd"> profiles, and is ignored for XYZ and sRGB.</span> <span class="sd"> :returns: A CmsProfile class object</span> <span class="sd"> :exception PyCMSError:</span> <span class="sd"> """</span> <span class="k">if</span> <span class="n">colorSpace</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"LAB"</span><span class="p">,</span> <span class="s2">"XYZ"</span><span class="p">,</span> <span class="s2">"sRGB"</span><span class="p">]:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span> <span class="s2">"Color space not supported for on-the-fly profile creation (</span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="n">colorSpace</span><span class="p">)</span> <span class="k">if</span> <span class="n">colorSpace</span> <span class="o">==</span> <span class="s2">"LAB"</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">colorTemp</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">colorTemp</span><span class="p">)</span> <span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span> <span class="s2">"Color temperature must be numeric, </span><span class="se">\"</span><span class="si">%s</span><span class="se">\"</span><span class="s2"> not valid"</span> <span class="o">%</span> <span class="n">colorTemp</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="n">core</span><span class="o">.</span><span class="n">createProfile</span><span class="p">(</span><span class="n">colorSpace</span><span class="p">,</span> <span class="n">colorTemp</span><span class="p">)</span> <span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="n">v</span><span class="p">)</span></div> <div class="viewcode-block" id="getProfileName"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.getProfileName">[docs]</a><span class="k">def</span> <span class="nf">getProfileName</span><span class="p">(</span><span class="n">profile</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Gets the internal product name for the given profile.</span> <span class="sd"> If profile isn't a valid CmsProfile object or filename to a profile,</span> <span class="sd"> a PyCMSError is raised If an error occurs while trying to obtain the</span> <span class="sd"> name tag, a PyCMSError is raised.</span> <span class="sd"> Use this function to obtain the INTERNAL name of the profile (stored</span> <span class="sd"> in an ICC tag in the profile itself), usually the one used when the</span> <span class="sd"> profile was originally created. Sometimes this tag also contains</span> <span class="sd"> additional information supplied by the creator.</span> <span class="sd"> :param profile: EITHER a valid CmsProfile object, OR a string of the</span> <span class="sd"> filename of an ICC profile.</span> <span class="sd"> :returns: A string containing the internal name of the profile as stored</span> <span class="sd"> in an ICC tag.</span> <span class="sd"> :exception PyCMSError:</span> <span class="sd"> """</span> <span class="k">try</span><span class="p">:</span> <span class="c1"># add an extra newline to preserve pyCMS compatibility</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">profile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">profile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">profile</span><span class="p">)</span> <span class="c1"># do it in python, not c.</span> <span class="c1"># // name was "%s - %s" (model, manufacturer) || Description ,</span> <span class="c1"># // but if the Model and Manufacturer were the same or the model</span> <span class="c1"># // was long, Just the model, in 1.x</span> <span class="n">model</span> <span class="o">=</span> <span class="n">profile</span><span class="o">.</span><span class="n">profile</span><span class="o">.</span><span class="n">product_model</span> <span class="n">manufacturer</span> <span class="o">=</span> <span class="n">profile</span><span class="o">.</span><span class="n">profile</span><span class="o">.</span><span class="n">product_manufacturer</span> <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">model</span> <span class="ow">or</span> <span class="n">manufacturer</span><span class="p">):</span> <span class="k">return</span> <span class="n">profile</span><span class="o">.</span><span class="n">profile</span><span class="o">.</span><span class="n">product_description</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">manufacturer</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="p">)</span> <span class="o">></span> <span class="mi">30</span><span class="p">:</span> <span class="k">return</span> <span class="n">model</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="k">return</span> <span class="s2">"</span><span class="si">%s</span><span class="s2"> - </span><span class="si">%s</span><span class="se">\n</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">manufacturer</span><span class="p">)</span> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">IOError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="n">v</span><span class="p">)</span></div> <div class="viewcode-block" id="getProfileInfo"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.getProfileInfo">[docs]</a><span class="k">def</span> <span class="nf">getProfileInfo</span><span class="p">(</span><span class="n">profile</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Gets the internal product information for the given profile.</span> <span class="sd"> If profile isn't a valid CmsProfile object or filename to a profile,</span> <span class="sd"> a PyCMSError is raised.</span> <span class="sd"> If an error occurs while trying to obtain the info tag, a PyCMSError</span> <span class="sd"> is raised</span> <span class="sd"> Use this function to obtain the information stored in the profile's</span> <span class="sd"> info tag. This often contains details about the profile, and how it</span> <span class="sd"> was created, as supplied by the creator.</span> <span class="sd"> :param profile: EITHER a valid CmsProfile object, OR a string of the</span> <span class="sd"> filename of an ICC profile.</span> <span class="sd"> :returns: A string containing the internal profile information stored in</span> <span class="sd"> an ICC tag.</span> <span class="sd"> :exception PyCMSError:</span> <span class="sd"> """</span> <span class="k">try</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">profile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">profile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">profile</span><span class="p">)</span> <span class="c1"># add an extra newline to preserve pyCMS compatibility</span> <span class="c1"># Python, not C. the white point bits weren't working well,</span> <span class="c1"># so skipping.</span> <span class="c1"># info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint</span> <span class="n">description</span> <span class="o">=</span> <span class="n">profile</span><span class="o">.</span><span class="n">profile</span><span class="o">.</span><span class="n">product_description</span> <span class="n">cpright</span> <span class="o">=</span> <span class="n">profile</span><span class="o">.</span><span class="n">profile</span><span class="o">.</span><span class="n">product_copyright</span> <span class="n">arr</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">elt</span> <span class="ow">in</span> <span class="p">(</span><span class="n">description</span><span class="p">,</span> <span class="n">cpright</span><span class="p">):</span> <span class="k">if</span> <span class="n">elt</span><span class="p">:</span> <span class="n">arr</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">elt</span><span class="p">)</span> <span class="k">return</span> <span class="s2">"</span><span class="se">\r\n\r\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\r\n\r\n</span><span class="s2">"</span> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">IOError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="n">v</span><span class="p">)</span></div> <div class="viewcode-block" id="getProfileCopyright"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.getProfileCopyright">[docs]</a><span class="k">def</span> <span class="nf">getProfileCopyright</span><span class="p">(</span><span class="n">profile</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Gets the copyright for the given profile.</span> <span class="sd"> If profile isn't a valid CmsProfile object or filename to a profile,</span> <span class="sd"> a PyCMSError is raised.</span> <span class="sd"> If an error occurs while trying to obtain the copyright tag, a PyCMSError</span> <span class="sd"> is raised</span> <span class="sd"> Use this function to obtain the information stored in the profile's</span> <span class="sd"> copyright tag.</span> <span class="sd"> :param profile: EITHER a valid CmsProfile object, OR a string of the</span> <span class="sd"> filename of an ICC profile.</span> <span class="sd"> :returns: A string containing the internal profile information stored in</span> <span class="sd"> an ICC tag.</span> <span class="sd"> :exception PyCMSError:</span> <span class="sd"> """</span> <span class="k">try</span><span class="p">:</span> <span class="c1"># add an extra newline to preserve pyCMS compatibility</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">profile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">profile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">profile</span><span class="p">)</span> <span class="k">return</span> <span class="n">profile</span><span class="o">.</span><span class="n">profile</span><span class="o">.</span><span class="n">product_copyright</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">IOError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="n">v</span><span class="p">)</span></div> <div class="viewcode-block" id="getProfileManufacturer"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.getProfileManufacturer">[docs]</a><span class="k">def</span> <span class="nf">getProfileManufacturer</span><span class="p">(</span><span class="n">profile</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Gets the manufacturer for the given profile.</span> <span class="sd"> If profile isn't a valid CmsProfile object or filename to a profile,</span> <span class="sd"> a PyCMSError is raised.</span> <span class="sd"> If an error occurs while trying to obtain the manufacturer tag, a</span> <span class="sd"> PyCMSError is raised</span> <span class="sd"> Use this function to obtain the information stored in the profile's</span> <span class="sd"> manufacturer tag.</span> <span class="sd"> :param profile: EITHER a valid CmsProfile object, OR a string of the</span> <span class="sd"> filename of an ICC profile.</span> <span class="sd"> :returns: A string containing the internal profile information stored in</span> <span class="sd"> an ICC tag.</span> <span class="sd"> :exception PyCMSError:</span> <span class="sd"> """</span> <span class="k">try</span><span class="p">:</span> <span class="c1"># add an extra newline to preserve pyCMS compatibility</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">profile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">profile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">profile</span><span class="p">)</span> <span class="k">return</span> <span class="n">profile</span><span class="o">.</span><span class="n">profile</span><span class="o">.</span><span class="n">product_manufacturer</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">IOError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="n">v</span><span class="p">)</span></div> <div class="viewcode-block" id="getProfileModel"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.getProfileModel">[docs]</a><span class="k">def</span> <span class="nf">getProfileModel</span><span class="p">(</span><span class="n">profile</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Gets the model for the given profile.</span> <span class="sd"> If profile isn't a valid CmsProfile object or filename to a profile,</span> <span class="sd"> a PyCMSError is raised.</span> <span class="sd"> If an error occurs while trying to obtain the model tag, a PyCMSError</span> <span class="sd"> is raised</span> <span class="sd"> Use this function to obtain the information stored in the profile's</span> <span class="sd"> model tag.</span> <span class="sd"> :param profile: EITHER a valid CmsProfile object, OR a string of the</span> <span class="sd"> filename of an ICC profile.</span> <span class="sd"> :returns: A string containing the internal profile information stored in</span> <span class="sd"> an ICC tag.</span> <span class="sd"> :exception PyCMSError:</span> <span class="sd"> """</span> <span class="k">try</span><span class="p">:</span> <span class="c1"># add an extra newline to preserve pyCMS compatibility</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">profile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">profile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">profile</span><span class="p">)</span> <span class="k">return</span> <span class="n">profile</span><span class="o">.</span><span class="n">profile</span><span class="o">.</span><span class="n">product_model</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">IOError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="n">v</span><span class="p">)</span></div> <div class="viewcode-block" id="getProfileDescription"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.getProfileDescription">[docs]</a><span class="k">def</span> <span class="nf">getProfileDescription</span><span class="p">(</span><span class="n">profile</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Gets the description for the given profile.</span> <span class="sd"> If profile isn't a valid CmsProfile object or filename to a profile,</span> <span class="sd"> a PyCMSError is raised.</span> <span class="sd"> If an error occurs while trying to obtain the description tag, a PyCMSError</span> <span class="sd"> is raised</span> <span class="sd"> Use this function to obtain the information stored in the profile's</span> <span class="sd"> description tag.</span> <span class="sd"> :param profile: EITHER a valid CmsProfile object, OR a string of the</span> <span class="sd"> filename of an ICC profile.</span> <span class="sd"> :returns: A string containing the internal profile information stored in an</span> <span class="sd"> ICC tag.</span> <span class="sd"> :exception PyCMSError:</span> <span class="sd"> """</span> <span class="k">try</span><span class="p">:</span> <span class="c1"># add an extra newline to preserve pyCMS compatibility</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">profile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">profile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">profile</span><span class="p">)</span> <span class="k">return</span> <span class="n">profile</span><span class="o">.</span><span class="n">profile</span><span class="o">.</span><span class="n">product_description</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">IOError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="n">v</span><span class="p">)</span></div> <div class="viewcode-block" id="getDefaultIntent"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.getDefaultIntent">[docs]</a><span class="k">def</span> <span class="nf">getDefaultIntent</span><span class="p">(</span><span class="n">profile</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Gets the default intent name for the given profile.</span> <span class="sd"> If profile isn't a valid CmsProfile object or filename to a profile,</span> <span class="sd"> a PyCMSError is raised.</span> <span class="sd"> If an error occurs while trying to obtain the default intent, a</span> <span class="sd"> PyCMSError is raised.</span> <span class="sd"> Use this function to determine the default (and usually best optimized)</span> <span class="sd"> rendering intent for this profile. Most profiles support multiple</span> <span class="sd"> rendering intents, but are intended mostly for one type of conversion.</span> <span class="sd"> If you wish to use a different intent than returned, use</span> <span class="sd"> ImageCms.isIntentSupported() to verify it will work first.</span> <span class="sd"> :param profile: EITHER a valid CmsProfile object, OR a string of the</span> <span class="sd"> filename of an ICC profile.</span> <span class="sd"> :returns: Integer 0-3 specifying the default rendering intent for this</span> <span class="sd"> profile.</span> <span class="sd"> ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT)</span> <span class="sd"> ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1</span> <span class="sd"> ImageCms.INTENT_SATURATION = 2</span> <span class="sd"> ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3</span> <span class="sd"> see the pyCMS documentation for details on rendering intents and what</span> <span class="sd"> they do.</span> <span class="sd"> :exception PyCMSError:</span> <span class="sd"> """</span> <span class="k">try</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">profile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">profile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">profile</span><span class="p">)</span> <span class="k">return</span> <span class="n">profile</span><span class="o">.</span><span class="n">profile</span><span class="o">.</span><span class="n">rendering_intent</span> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">IOError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="n">v</span><span class="p">)</span></div> <div class="viewcode-block" id="isIntentSupported"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.isIntentSupported">[docs]</a><span class="k">def</span> <span class="nf">isIntentSupported</span><span class="p">(</span><span class="n">profile</span><span class="p">,</span> <span class="n">intent</span><span class="p">,</span> <span class="n">direction</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Checks if a given intent is supported.</span> <span class="sd"> Use this function to verify that you can use your desired</span> <span class="sd"> renderingIntent with profile, and that profile can be used for the</span> <span class="sd"> input/output/proof profile as you desire.</span> <span class="sd"> Some profiles are created specifically for one "direction", can cannot</span> <span class="sd"> be used for others. Some profiles can only be used for certain</span> <span class="sd"> rendering intents... so it's best to either verify this before trying</span> <span class="sd"> to create a transform with them (using this function), or catch the</span> <span class="sd"> potential PyCMSError that will occur if they don't support the modes</span> <span class="sd"> you select.</span> <span class="sd"> :param profile: EITHER a valid CmsProfile object, OR a string of the</span> <span class="sd"> filename of an ICC profile.</span> <span class="sd"> :param intent: Integer (0-3) specifying the rendering intent you wish to</span> <span class="sd"> use with this profile</span> <span class="sd"> ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT)</span> <span class="sd"> ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1</span> <span class="sd"> ImageCms.INTENT_SATURATION = 2</span> <span class="sd"> ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3</span> <span class="sd"> see the pyCMS documentation for details on rendering intents and what</span> <span class="sd"> they do.</span> <span class="sd"> :param direction: Integer specifying if the profile is to be used for</span> <span class="sd"> input, output, or proof</span> <span class="sd"> INPUT = 0 (or use ImageCms.DIRECTION_INPUT)</span> <span class="sd"> OUTPUT = 1 (or use ImageCms.DIRECTION_OUTPUT)</span> <span class="sd"> PROOF = 2 (or use ImageCms.DIRECTION_PROOF)</span> <span class="sd"> :returns: 1 if the intent/direction are supported, -1 if they are not.</span> <span class="sd"> :exception PyCMSError:</span> <span class="sd"> """</span> <span class="k">try</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">profile</span><span class="p">,</span> <span class="n">ImageCmsProfile</span><span class="p">):</span> <span class="n">profile</span> <span class="o">=</span> <span class="n">ImageCmsProfile</span><span class="p">(</span><span class="n">profile</span><span class="p">)</span> <span class="c1"># FIXME: I get different results for the same data w. different</span> <span class="c1"># compilers. Bug in LittleCMS or in the binding?</span> <span class="k">if</span> <span class="n">profile</span><span class="o">.</span><span class="n">profile</span><span class="o">.</span><span class="n">is_intent_supported</span><span class="p">(</span><span class="n">intent</span><span class="p">,</span> <span class="n">direction</span><span class="p">):</span> <span class="k">return</span> <span class="mi">1</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="o">-</span><span class="mi">1</span> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">IOError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span> <span class="k">raise</span> <span class="n">PyCMSError</span><span class="p">(</span><span class="n">v</span><span class="p">)</span></div> <div class="viewcode-block" id="versions"><a class="viewcode-back" href="../../reference/ImageCms.html#PIL.ImageCms.versions">[docs]</a><span class="k">def</span> <span class="nf">versions</span><span class="p">():</span> <span class="sd">"""</span> <span class="sd"> (pyCMS) Fetches versions.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="p">(</span> <span class="n">VERSION</span><span class="p">,</span> <span class="n">core</span><span class="o">.</span><span class="n">littlecms_version</span><span class="p">,</span> <span class="n">sys</span><span class="o">.</span><span class="n">version</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span> <span class="n">Image</span><span class="o">.</span><span class="n">VERSION</span> <span class="p">)</span></div> </pre></div> </div> </div> <footer> <hr/> <div role="contentinfo"> <p> © Copyright 1995-2011 Fredrik Lundh, 2010-2018 Alex Clark and Contributors </p> </div> Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. </footer> </div> </div> </section> </div> <script type="text/javascript"> jQuery(function () { SphinxRtdTheme.Navigation.enable(true); }); </script> </body> </html>