mirror of
https://github.com/boostorg/gil.git
synced 2026-01-23 17:42:30 +00:00
737 lines
62 KiB
HTML
737 lines
62 KiB
HTML
|
||
|
||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
|
||
<title>IO extensions - Boost.GIL documentation</title>
|
||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||
<link rel="stylesheet" href="_static/style.css" type="text/css" />
|
||
<script type="text/javascript">
|
||
var DOCUMENTATION_OPTIONS = {
|
||
URL_ROOT: './',
|
||
VERSION: '',
|
||
COLLAPSE_MODINDEX: false,
|
||
FILE_SUFFIX: '.html'
|
||
};
|
||
</script>
|
||
<script type="text/javascript" src="_static/documentation_options.js"></script>
|
||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||
<script type="text/javascript" src="_static/sphinx_highlight.js"></script>
|
||
<script data-url_root="./" id="documentation_options" src="./_static/documentation_options.js"></script>
|
||
<script src="./_static/searchtools.js"></script>
|
||
<script src="./_static/language_data.js"></script>
|
||
<link rel="index" title="Index" href="genindex.html" />
|
||
<link rel="search" title="Search" href="search.html" />
|
||
<link rel="top" title="Boost.GIL documentation" href="index.html" />
|
||
<link rel="next" title="ToolBox extension" href="toolbox.html" />
|
||
<link rel="prev" title="STD extension" href="histogram/extension/std.html" />
|
||
</head>
|
||
<body>
|
||
<div class="header">
|
||
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||
"header">
|
||
<tr>
|
||
<td valign="top" width="300">
|
||
<h3><a href="index.html"><img
|
||
alt="C++ Boost" src="_static/gil.png" border="0"></a></h3>
|
||
</td>
|
||
<td >
|
||
<h1 align="center"><a href="index.html"></a></h1>
|
||
</td>
|
||
<td>
|
||
<div id="searchbox" style="display: none">
|
||
<form class="search" action="search.html" method="get">
|
||
<input type="text" name="q" size="18" />
|
||
<input type="submit" value="Search" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
<hr/>
|
||
<div class="content">
|
||
<div class="navbar" style="text-align:right;">
|
||
|
||
|
||
<a class="prev" title="STD extension" href="histogram/extension/std.html"><img src="_static/prev.png" alt="prev"/></a>
|
||
<a class="next" title="ToolBox extension" href="toolbox.html"><img src="_static/next.png" alt="next"/></a>
|
||
|
||
</div>
|
||
|
||
<section id="io-extensions">
|
||
<h1>IO extensions<a class="headerlink" href="#io-extensions" title="Link to this heading">¶</a></h1>
|
||
<section id="overview">
|
||
<h2>Overview<a class="headerlink" href="#overview" title="Link to this heading">¶</a></h2>
|
||
<p>This extension to boost::gil provides an easy to use interface for reading and
|
||
writing various image formats. It also includes a framework for adding
|
||
new formats.</p>
|
||
<p>Please see section 3.3 for all supported image formats. A basic tutorial is
|
||
provided in section [link gil.io.tutorial Tutorial].
|
||
Also, this extension requires Boost version 1.42 and up.
|
||
Furthermore the GIL extension Toolbox is used.</p>
|
||
<p>For adding new image formats please refer to section
|
||
[link gil.io.using_io.extending_gil__io_with_new_formats Extending GIL::IO with new Formats].</p>
|
||
</section>
|
||
<section id="supported-platforms">
|
||
<h2>Supported Platforms<a class="headerlink" href="#supported-platforms" title="Link to this heading">¶</a></h2>
|
||
<p>All platforms supported by Boost which have a decent C++ compiler.
|
||
Depending on the image format one or more of the following image
|
||
libraries might be needed:</p>
|
||
<ul class="simple">
|
||
<li><p>libtiff</p></li>
|
||
<li><p>libjpeg</p></li>
|
||
<li><p>libpng</p></li>
|
||
<li><p>libraw</p></li>
|
||
<li><p>zlib</p></li>
|
||
</ul>
|
||
<p>The library is designed to support as many formats as required by the user.
|
||
For instance, if the user only needs bmp support none of the above mentioned
|
||
dependencies are required.</p>
|
||
<p>There are more details available in this documentation on the image format
|
||
dependencies. Please see section
|
||
[link gil.io.using_io.supported_image_formats Supported Image Formats].</p>
|
||
</section>
|
||
<section id="tutorial">
|
||
<h2>Tutorial<a class="headerlink" href="#tutorial" title="Link to this heading">¶</a></h2>
|
||
<p>Thanks to modern C++ programming techniques the interface for this library
|
||
is rather small and easy to use. In this tutorial I’ll give you a short
|
||
walk-around on how to use this boost::gil extension.
|
||
For more details please refer to section 3.</p>
|
||
<p>For each supported IO format a single top-level header file is provided.
|
||
For instance, include <cite>boost/gil/extension/io/tiff.hpp</cite> to be able
|
||
to read or write TIFF files.</p>
|
||
<section id="reading-an-image">
|
||
<h3>Reading An Image<a class="headerlink" href="#reading-an-image" title="Link to this heading">¶</a></h3>
|
||
<p>Probably the most common case to read a tiff image can be done as follows:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="w"> </span><span class="n">filename</span><span class="p">(</span><span class="w"> </span><span class="s">"image.tif"</span><span class="w"> </span><span class="p">);</span>
|
||
<span class="n">rgb8_image_t</span><span class="w"> </span><span class="n">img</span><span class="p">;</span>
|
||
<span class="n">read_image</span><span class="p">(</span><span class="w"> </span><span class="n">filename</span><span class="p">,</span><span class="w"> </span><span class="n">img</span><span class="p">,</span><span class="w"> </span><span class="n">tiff_tag</span><span class="p">()</span><span class="w"> </span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>The code would be same for all other image formats. The only thing that needs
|
||
to change is the tag type ( tiff_tag ) in the read_image call.
|
||
The read_image() expects the supplied image type to be compatible with the
|
||
image stored in the file. If the user doesn’t know what format an image has she
|
||
can use read_and_convert_image().
|
||
Another important fact is that read_image() will allocate the appropriate
|
||
memory needed for the read operation. There are <code class="docutils literal notranslate"><span class="pre">read_view</span></code> or
|
||
<code class="docutils literal notranslate"><span class="pre">read_and_convert_view</span></code> counterparts, if the memory is already allocated.</p>
|
||
<p>Sometimes the user only wants to read a sub-part of an image,
|
||
then the above call would look as follows:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="n">read_image</span><span class="p">(</span><span class="w"> </span><span class="n">filename</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">img</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">image_read_settings</span><span class="o"><</span><span class="w"> </span><span class="n">tiff_tag</span><span class="w"> </span><span class="o">></span><span class="p">(</span><span class="w"> </span><span class="n">point_t</span><span class="p">(</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">),</span><span class="w"> </span><span class="n">point_t</span><span class="p">(</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="mi">50</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>The image_read_settings class will provide the user with image format
|
||
independent reading setting but can also serve as a pointer for format
|
||
dependent settings.
|
||
Please see the specific image format sections
|
||
[link gil.io.using_io.supported_image_formats Supported Image Formats]
|
||
for more details.</p>
|
||
</section>
|
||
<section id="writing-an-image">
|
||
<h3>Writing An Image<a class="headerlink" href="#writing-an-image" title="Link to this heading">¶</a></h3>
|
||
<p>Besides reading the information also writing is the second part of this
|
||
Boost.GIL extension. Writing is a lot simpler than reading since an existing
|
||
image view contains all the information.</p>
|
||
<p>For instance writing an image can be done as follows:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="w"> </span><span class="n">filename</span><span class="p">(</span><span class="w"> </span><span class="s">"image.tif"</span><span class="w"> </span><span class="p">);</span>
|
||
<span class="n">rgb8_image_t</span><span class="w"> </span><span class="nf">img</span><span class="p">(</span><span class="w"> </span><span class="mi">640</span><span class="p">,</span><span class="w"> </span><span class="mi">480</span><span class="w"> </span><span class="p">);</span>
|
||
|
||
<span class="c1">// write data into image</span>
|
||
|
||
<span class="n">write_view</span><span class="p">(</span><span class="w"> </span><span class="n">filename</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">view</span><span class="p">(</span><span class="w"> </span><span class="n">img</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">tiff_tag</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>The interface is similar to reading an image. To add image format specific
|
||
parameter the user can use <code class="docutils literal notranslate"><span class="pre">image_write_info</span></code> class.
|
||
For instance, a user can specify the JPEG quality when writing like this:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="w"> </span><span class="n">filename</span><span class="p">(</span><span class="w"> </span><span class="s">"image.jpg"</span><span class="w"> </span><span class="p">);</span>
|
||
<span class="n">rgb8_image_t</span><span class="w"> </span><span class="nf">img</span><span class="p">(</span><span class="w"> </span><span class="mi">640</span><span class="p">,</span><span class="w"> </span><span class="mi">480</span><span class="w"> </span><span class="p">);</span>
|
||
|
||
<span class="c1">// write data into image</span>
|
||
|
||
<span class="n">write_view</span><span class="p">(</span><span class="w"> </span><span class="n">filename</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">view</span><span class="p">(</span><span class="w"> </span><span class="n">img</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">image_write_info</span><span class="o"><</span><span class="w"> </span><span class="n">jpeg_tag</span><span class="w"> </span><span class="o">></span><span class="p">(</span><span class="w"> </span><span class="mi">95</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>The above example will write an image where the jpeg quality is
|
||
set to 95 percent.</p>
|
||
</section>
|
||
<section id="reading-and-writing-in-memory-buffers">
|
||
<h3>Reading And Writing In-Memory Buffers<a class="headerlink" href="#reading-and-writing-in-memory-buffers" title="Link to this heading">¶</a></h3>
|
||
<p>Reading and writing in-memory buffers are supported as well. See as follows:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="c1">// 1. Read an image.</span>
|
||
<span class="n">ifstream</span><span class="w"> </span><span class="n">in</span><span class="p">(</span><span class="w"> </span><span class="s">"test.tif"</span><span class="p">,</span><span class="w"> </span><span class="n">ios</span><span class="o">::</span><span class="n">binary</span><span class="w"> </span><span class="p">);</span>
|
||
|
||
<span class="n">rgb8_image_t</span><span class="w"> </span><span class="n">img</span><span class="p">;</span>
|
||
<span class="n">read_image</span><span class="p">(</span><span class="w"> </span><span class="n">in</span><span class="p">,</span><span class="w"> </span><span class="n">img</span><span class="p">,</span><span class="w"> </span><span class="n">tiff_tag</span><span class="p">()</span><span class="w"> </span><span class="p">);</span>
|
||
|
||
<span class="c1">// 2. Write image to in-memory buffer.</span>
|
||
<span class="n">stringstream</span><span class="w"> </span><span class="nf">out_buffer</span><span class="p">(</span><span class="w"> </span><span class="n">ios_base</span><span class="o">::</span><span class="n">out</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">ios_base</span><span class="o">::</span><span class="n">binary</span><span class="w"> </span><span class="p">);</span>
|
||
|
||
<span class="n">rgb8_image_t</span><span class="w"> </span><span class="n">src</span><span class="p">;</span>
|
||
<span class="n">write_view</span><span class="p">(</span><span class="w"> </span><span class="n">out_buffer</span><span class="p">,</span><span class="w"> </span><span class="n">view</span><span class="p">(</span><span class="w"> </span><span class="n">src</span><span class="w"> </span><span class="p">),</span><span class="w"> </span><span class="n">tiff_tag</span><span class="p">()</span><span class="w"> </span><span class="p">);</span>
|
||
|
||
<span class="c1">// 3. Copy in-memory buffer to another.</span>
|
||
<span class="n">stringstream</span><span class="w"> </span><span class="nf">in_buffer</span><span class="p">(</span><span class="w"> </span><span class="n">ios_base</span><span class="o">::</span><span class="n">in</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">ios_base</span><span class="o">::</span><span class="n">binary</span><span class="w"> </span><span class="p">);</span>
|
||
<span class="n">in_buffer</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">out_buffer</span><span class="p">.</span><span class="n">rdbuf</span><span class="p">();</span>
|
||
|
||
<span class="c1">// 4. Read in-memory buffer to gil image</span>
|
||
<span class="n">rgb8_image_t</span><span class="w"> </span><span class="n">dst</span><span class="p">;</span>
|
||
<span class="n">read_image</span><span class="p">(</span><span class="w"> </span><span class="n">in_buffer</span><span class="p">,</span><span class="w"> </span><span class="n">dst</span><span class="p">,</span><span class="w"> </span><span class="n">tag_t</span><span class="p">()</span><span class="w"> </span><span class="p">);</span>
|
||
|
||
<span class="c1">// 5. Write out image.</span>
|
||
<span class="n">string</span><span class="w"> </span><span class="n">filename</span><span class="p">(</span><span class="w"> </span><span class="s">"out.tif"</span><span class="w"> </span><span class="p">);</span>
|
||
<span class="n">ofstream</span><span class="w"> </span><span class="nf">out</span><span class="p">(</span><span class="w"> </span><span class="n">filename</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span><span class="w"> </span><span class="n">ios_base</span><span class="o">::</span><span class="n">binary</span><span class="w"> </span><span class="p">);</span>
|
||
<span class="n">write_view</span><span class="p">(</span><span class="w"> </span><span class="n">out</span><span class="p">,</span><span class="w"> </span><span class="n">view</span><span class="p">(</span><span class="w"> </span><span class="n">dst</span><span class="w"> </span><span class="p">),</span><span class="w"> </span><span class="n">tiff_tag</span><span class="p">()</span><span class="w"> </span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>In case the user is using his own stream classes he has to make sure it
|
||
has the common interface read, write, seek, close, etc. interface.</p>
|
||
</section>
|
||
</section>
|
||
<section id="using-io">
|
||
<h2>Using IO<a class="headerlink" href="#using-io" title="Link to this heading">¶</a></h2>
|
||
<section id="general-overview">
|
||
<h3>General Overview<a class="headerlink" href="#general-overview" title="Link to this heading">¶</a></h3>
|
||
<p>The tutorial pointed out some use cases for reading and writing images in
|
||
various image formats. This section will provide a more thorough overview.</p>
|
||
<p>The next sections will introduce the Read and Write interface. But it might be
|
||
worth pointing out that by using some advanced metaprogramming techniques the
|
||
interface is rather small and hopefully easy to understand.</p>
|
||
<p>Besides the general interface the user also has the ability to interface
|
||
directly with the underlying image format. For that each reader or writer
|
||
provides access to the so-called backend.</p>
|
||
<p>For instance:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="k">typedef</span><span class="w"> </span><span class="n">bmp_tag</span><span class="w"> </span><span class="n">tag_t</span><span class="p">;</span>
|
||
|
||
<span class="k">typedef</span><span class="w"> </span><span class="n">get_reader_backend</span><span class="o"><</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">string</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">tag_t</span>
|
||
<span class="w"> </span><span class="o">>::</span><span class="n">type</span><span class="w"> </span><span class="n">backend_t</span><span class="p">;</span>
|
||
|
||
<span class="n">backend_t</span><span class="w"> </span><span class="n">backend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">read_image_info</span><span class="p">(</span><span class="w"> </span><span class="n">bmp_filename</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">tag_t</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="p">);</span>
|
||
|
||
<span class="n">BOOST_CHECK_EQUAL</span><span class="p">(</span><span class="w"> </span><span class="n">backend</span><span class="p">.</span><span class="n">_info</span><span class="p">.</span><span class="n">_width</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="mi">127</span><span class="w"> </span><span class="p">);</span>
|
||
<span class="n">BOOST_CHECK_EQUAL</span><span class="p">(</span><span class="w"> </span><span class="n">backend</span><span class="p">.</span><span class="n">_info</span><span class="p">.</span><span class="n">_height</span><span class="p">,</span><span class="w"> </span><span class="mi">64</span><span class="w"> </span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>Of course, the typedef can be removed when using c++11’s auto feature.</p>
|
||
</section>
|
||
<section id="read-interface">
|
||
<h3>Read Interface<a class="headerlink" href="#read-interface" title="Link to this heading">¶</a></h3>
|
||
<p>As the Tutorial demonstrated there are a few ways to read images.
|
||
Here is an enumeration of all read functions with a short description:</p>
|
||
<ul class="simple">
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">read_image</span></code> - read into a gil image with no conversion.
|
||
Memory is allocated.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">read_view</span></code> - read into a gil view with no conversion.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">read_and_convert_image</span></code> - read and convert into a gil image.
|
||
Memory is allocated.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">read_and_convert_view</span></code> - read and convert into a gil view.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">read_image_info</span></code> - read the image header.</p></li>
|
||
</ul>
|
||
<p>Conversion in this context is necessary if the source (file) has an
|
||
incompatible color space with the destination (gil image type).
|
||
If that’s the case the user has to use the xxx_and_convert_xxx variants.</p>
|
||
<p>All functions take the filename or a device as the first parameter.
|
||
The filename can be anything from a C-string, <code class="docutils literal notranslate"><span class="pre">std::string</span></code>,
|
||
<code class="docutils literal notranslate"><span class="pre">std::wstring</span></code> to <code class="docutils literal notranslate"><span class="pre">std::filesystem</span></code> and <code class="docutils literal notranslate"><span class="pre">boost::filesystem</span></code> path.
|
||
The availability of the <code class="docutils literal notranslate"><span class="pre">std::filesystem</span></code> is detected automatically,
|
||
unless <code class="docutils literal notranslate"><span class="pre">BOOST_GIL_IO_USE_BOOST_FILESYSTEM</span></code> macro is defined that forces
|
||
preference of the Boost.Filesystem.
|
||
Devices could be a <code class="docutils literal notranslate"><span class="pre">FILE*</span></code>, <code class="docutils literal notranslate"><span class="pre">std::ifstream</span></code>, and <code class="docutils literal notranslate"><span class="pre">TIFF*</span></code> for TIFF images.</p>
|
||
<p>The second parameter is either an image or view type depending on the
|
||
<code class="docutils literal notranslate"><span class="pre">read_xxx</span></code> function.
|
||
The third and last parameter is either an instance of the
|
||
<code class="docutils literal notranslate"><span class="pre">image_read_settings<FormatTag></span></code> or just the <code class="docutils literal notranslate"><span class="pre">FormatTag</span></code>.
|
||
The settings can be various depending on the format which is being read.
|
||
But they all share settings for reading a partial image area.
|
||
The first point describes the top left image coordinate whereas the second
|
||
are the dimensions in x and y directions.</p>
|
||
<p>Here is an example of setting up partial read:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="n">read_image</span><span class="p">(</span><span class="w"> </span><span class="n">filename</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">img</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">image_read_settings</span><span class="o"><</span><span class="w"> </span><span class="n">tiff_tag</span><span class="w"> </span><span class="o">></span><span class="p">(</span><span class="w"> </span><span class="n">point_t</span><span class="p">(</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">),</span><span class="w"> </span><span class="n">point_t</span><span class="p">(</span><span class="w"> </span><span class="mi">50</span><span class="p">,</span><span class="w"> </span><span class="mi">50</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>Each format supports reading just the header information,
|
||
using <code class="docutils literal notranslate"><span class="pre">read_image_info</span></code>. Please refer to the format specific sections
|
||
under 3.3. A basic example follows:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="n">image_read_info</span><span class="o"><</span><span class="w"> </span><span class="n">tiff_t</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">info</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">read_image_info</span><span class="p">(</span><span class="w"> </span><span class="n">filename</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">tiff_t</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>GIL also comes with a dynamic image extension.
|
||
In the context of GIL.IO a user can define an <code class="docutils literal notranslate"><span class="pre">any_image</span></code> type based on
|
||
several image types. The IO extension would then pick the matching image type
|
||
to the current image file.
|
||
The following example shows this feature:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="n">any_image</span><span class="o"><</span><span class="w"> </span><span class="n">gray8_image_t</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">gray16_image_t</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">rgb8_image_t</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">rgba8_image_t</span>
|
||
<span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">runtime_image</span><span class="p">;</span>
|
||
|
||
<span class="n">read_image</span><span class="p">(</span><span class="w"> </span><span class="n">filename</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">runtime_image</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">tiff_tag</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>During the review it became clear that there is a need to read big images
|
||
scanline by scanline. To support such use case a <code class="docutils literal notranslate"><span class="pre">scanline_reader</span></code> is
|
||
implemented for all supported image formats.
|
||
The <code class="docutils literal notranslate"><span class="pre">scanline_read_iterators</span></code> will then allow to traverse through the image.
|
||
The following code sample shows the usage:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="k">typedef</span><span class="w"> </span><span class="n">tiff_tag</span><span class="w"> </span><span class="n">tag_t</span><span class="p">;</span>
|
||
|
||
<span class="k">typedef</span><span class="w"> </span><span class="n">scanline_reader</span><span class="o"><</span><span class="w"> </span><span class="k">typename</span><span class="w"> </span><span class="nc">get_read_device</span><span class="o"><</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="o">*</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">tag_t</span>
|
||
<span class="w"> </span><span class="o">>::</span><span class="n">type</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">tag_t</span>
|
||
<span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">reader_t</span><span class="p">;</span>
|
||
|
||
<span class="n">reader_t</span><span class="w"> </span><span class="n">reader</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">make_scanline_reader</span><span class="p">(</span><span class="w"> </span><span class="s">"C:/boost/libs/gil/test/extension/io/images/tiff/test.tif"</span><span class="p">,</span><span class="w"> </span><span class="n">tag_t</span><span class="p">()</span><span class="w"> </span><span class="p">);</span>
|
||
|
||
<span class="k">typedef</span><span class="w"> </span><span class="n">rgba8_image_t</span><span class="w"> </span><span class="n">image_t</span><span class="p">;</span>
|
||
|
||
<span class="n">image_t</span><span class="w"> </span><span class="nf">dst</span><span class="p">(</span><span class="w"> </span><span class="n">reader</span><span class="p">.</span><span class="n">_info</span><span class="p">.</span><span class="n">_width</span><span class="p">,</span><span class="w"> </span><span class="n">reader</span><span class="p">.</span><span class="n">_info</span><span class="p">.</span><span class="n">_height</span><span class="w"> </span><span class="p">);</span>
|
||
<span class="n">fill_pixels</span><span class="p">(</span><span class="w"> </span><span class="n">view</span><span class="p">(</span><span class="n">dst</span><span class="p">),</span><span class="w"> </span><span class="n">image_t</span><span class="o">::</span><span class="n">value_type</span><span class="p">()</span><span class="w"> </span><span class="p">);</span>
|
||
|
||
<span class="k">typedef</span><span class="w"> </span><span class="n">reader_t</span><span class="o">::</span><span class="n">iterator_t</span><span class="w"> </span><span class="n">iterator_t</span><span class="p">;</span>
|
||
|
||
<span class="n">iterator_t</span><span class="w"> </span><span class="n">it</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">reader</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span>
|
||
<span class="n">iterator_t</span><span class="w"> </span><span class="n">end</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">reader</span><span class="p">.</span><span class="n">end</span><span class="p">();</span>
|
||
|
||
<span class="k">for</span><span class="p">(</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">row</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">it</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">end</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="n">it</span><span class="p">,</span><span class="w"> </span><span class="o">++</span><span class="n">row</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="p">{</span>
|
||
<span class="w"> </span><span class="n">copy_pixels</span><span class="p">(</span><span class="w"> </span><span class="n">interleaved_view</span><span class="p">(</span><span class="w"> </span><span class="n">reader</span><span class="p">.</span><span class="n">_info</span><span class="p">.</span><span class="n">_width</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">image_t</span><span class="o">::</span><span class="n">view_t</span><span class="o">::</span><span class="n">x_iterator</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="n">it</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">reader</span><span class="p">.</span><span class="n">_scanline_length</span>
|
||
<span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">subimage_view</span><span class="p">(</span><span class="w"> </span><span class="n">view</span><span class="p">(</span><span class="w"> </span><span class="n">dst</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="mi">0</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">row</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">reader</span><span class="p">.</span><span class="n">_info</span><span class="p">.</span><span class="n">_width</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="mi">1</span>
|
||
<span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">);</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>There are many ways to traverse an image but for as of now only by
|
||
scanline is supported.</p>
|
||
</section>
|
||
<section id="write-interface">
|
||
<h3>Write Interface<a class="headerlink" href="#write-interface" title="Link to this heading">¶</a></h3>
|
||
<p>There is only one function for writing out images, write_view.
|
||
Similar to reading the first parameter is either a filename or a device.
|
||
The filename can be anything from a C-string, <code class="docutils literal notranslate"><span class="pre">std::string</span></code>,
|
||
<code class="docutils literal notranslate"><span class="pre">std::wstring</span></code> to <code class="docutils literal notranslate"><span class="pre">std::filesystem</span></code> and <code class="docutils literal notranslate"><span class="pre">boost::filesystem</span></code> path.
|
||
The availability of the <code class="docutils literal notranslate"><span class="pre">std::filesystem</span></code> is detected automatically,
|
||
unless <code class="docutils literal notranslate"><span class="pre">BOOST_GIL_IO_USE_BOOST_FILESYSTEM</span></code> macro is defined that forces
|
||
preference of the Boost.Filesystem.
|
||
Devices could be <code class="docutils literal notranslate"><span class="pre">FILE*</span></code>, <code class="docutils literal notranslate"><span class="pre">std::ifstream</span></code>, and <code class="docutils literal notranslate"><span class="pre">TIFF*</span></code> for TIFF images.</p>
|
||
<p>The second parameter is a view object to image being written.
|
||
The third and last parameter is either a tag or an
|
||
<code class="docutils literal notranslate"><span class="pre">image_write_info<FormatTag></span></code> object containing more settings.
|
||
One example for instance is the JPEG quality.
|
||
Refer to the format specific sections under 3.3. to have a list of all
|
||
the possible settings.</p>
|
||
<p>Writing an any_image<…> is supported. See the following example:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="n">any_image</span><span class="o"><</span><span class="w"> </span><span class="n">gray8_image_t</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">gray16_image_t</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">rgb8_image_t</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">rgba8_image_t</span>
|
||
<span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">runtime_image</span><span class="p">;</span>
|
||
|
||
<span class="c1">// fill any_image</span>
|
||
|
||
<span class="n">write_view</span><span class="p">(</span><span class="w"> </span><span class="n">filename</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">view</span><span class="p">(</span><span class="w"> </span><span class="n">runtime_image</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">tiff_tag</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="compiler-symbols">
|
||
<h3>Compiler Symbols<a class="headerlink" href="#compiler-symbols" title="Link to this heading">¶</a></h3>
|
||
<p>The following table gives an overview of all supported compiler symbols
|
||
that can be set by the user:</p>
|
||
<table class="docutils align-default">
|
||
<thead>
|
||
<tr class="row-odd"><th class="head"><p>Symbol</p></th>
|
||
<th class="head"><p>Description</p></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr class="row-even"><td><p>BOOST_GIL_IO_ENABLE_GRAY_ALPHA</p></td>
|
||
<td><p>Enable the color space “gray_alpha”.</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td><p>BOOST_GIL_IO_PNG_FLOATING_POINT_SUPPORTED</p></td>
|
||
<td><p>Use libpng in floating point mode. This symbol is incompatible with BOOST_GIL_IO_PNG_FIXED_POINT_SUPPORTED.</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td><p>BOOST_GIL_IO_PNG_FIXED_POINT_SUPPORTED</p></td>
|
||
<td><p>Use libpng in integer mode. This symbol is incompatible with BOOST_GIL_IO_PNG_FLOATING_POINT_SUPPORTED.</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td><p>BOOST_GIL_IO_PNG_DITHERING_SUPPORTED</p></td>
|
||
<td><p>Look up “dithering” in libpng manual for explanation.</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td><p>BOOST_GIL_IO_PNG_1_4_OR_LOWER</p></td>
|
||
<td><p>Allow compiling with libpng 1.4 or lower.</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td><p>BOOST_GIL_EXTENSION_IO_JPEG_C_LIB_COMPILED_AS_CPLUSPLUS</p></td>
|
||
<td><p>libjpeg is compiled as c++ lib.</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td><p>BOOST_GIL_EXTENSION_IO_PNG_C_LIB_COMPILED_AS_CPLUSPLUS</p></td>
|
||
<td><p>libpng is compiled as c++ lib.</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td><p>BOOST_GIL_EXTENSION_IO_TIFF_C_LIB_COMPILED_AS_CPLUSPLUS</p></td>
|
||
<td><p>libtiff is compiled as c++ lib.</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td><p>BOOST_GIL_EXTENSION_IO_ZLIB_C_LIB_COMPILED_AS_CPLUSPLUS</p></td>
|
||
<td><p>zlib is compiled as c++ lib.</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td><p>BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES</p></td>
|
||
<td><p>Allow basic test images to be read from local hard drive. The paths can be set in paths.hpp</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td><p>BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES</p></td>
|
||
<td><p>Allow images to be written to the local hard drive. The paths can be set in paths.hpp</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td><p>BOOST_GIL_IO_USE_BMP_TEST_SUITE_IMAGES</p></td>
|
||
<td><p>Run tests using the bmp test images suite. See _BMP_TEST_FILES</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td><p>BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES</p></td>
|
||
<td><p>Run tests using the png test images suite. See _PNG_TEST_FILES</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td><p>BOOST_GIL_IO_USE_PNM_TEST_SUITE_IMAGES</p></td>
|
||
<td><p>Run tests using the pnm test images suite. Send me an email for accessing the files.</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td><p>BOOST_GIL_IO_USE_TIFF_LIBTIFF_TEST_SUITE_IMAGES</p></td>
|
||
<td><p>Run tests using the targa file format test images suite. See _TIFF_LIB_TIFF_TEST_FILES</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td><p>BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES</p></td>
|
||
<td><p>Run tests using the targa file format test images suite. See _TIFF_GRAPHICSMAGICK_TEST_FILES</p></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</section>
|
||
<section id="supported-image-formats">
|
||
<h3>Supported Image Formats<a class="headerlink" href="#supported-image-formats" title="Link to this heading">¶</a></h3>
|
||
<section id="bmp">
|
||
<h4>BMP<a class="headerlink" href="#bmp" title="Link to this heading">¶</a></h4>
|
||
<p>For a general overview of the BMP image file format go to the
|
||
following <a class="reference external" href="http://en.wikipedia.org/wiki/BMP_file_format">BMP_Wiki</a>.</p>
|
||
<p>Please note, the code has not been tested on X Windows System variations
|
||
of the BMP format which are usually referred to as XBM and XPM formats.</p>
|
||
<p>Here, only the MS Windows and OS/2 format is relevant.</p>
|
||
<p>Currently the code is able to read and write the following image types:</p>
|
||
<dl class="field-list simple">
|
||
<dt class="field-odd">Read<span class="colon">:</span></dt>
|
||
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">gray1_image_t</span></code>, <code class="docutils literal notranslate"><span class="pre">gray4_image_t</span></code>, <code class="docutils literal notranslate"><span class="pre">gray8_image_t</span></code>, <code class="docutils literal notranslate"><span class="pre">rgb8_image_t</span></code> and <code class="docutils literal notranslate"><span class="pre">rgba8_image_t</span></code></p>
|
||
</dd>
|
||
<dt class="field-even">Write<span class="colon">:</span></dt>
|
||
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">rgb8_image_t</span></code> and <code class="docutils literal notranslate"><span class="pre">rgba8_image_t</span></code></p>
|
||
</dd>
|
||
</dl>
|
||
<p>The lack of having an indexed image type in gil restricts the current
|
||
interface to only write out non-indexed images.
|
||
This is subject to change soon.</p>
|
||
</section>
|
||
<section id="jpeg">
|
||
<h4>JPEG<a class="headerlink" href="#jpeg" title="Link to this heading">¶</a></h4>
|
||
<p>For a general overview of the JPEG image file format go to the
|
||
following <a class="reference external" href="http://en.wikipedia.org/wiki/JPEG">JPEG_Wiki</a>.</p>
|
||
<p>This jpeg extension is based on the libjpeg library which can be
|
||
found here, <a class="reference external" href="http://www.ijg.org/">JPEG_Lib</a>.</p>
|
||
<p>All versions starting from 8x are supported.</p>
|
||
<p>The user has to make sure this library is properly installed.
|
||
I strongly recommend the user to build the library yourself.
|
||
It could potentially save you a lot of trouble.</p>
|
||
<p>Currently the code is able to read and write the following image types:</p>
|
||
<dl class="field-list simple">
|
||
<dt class="field-odd">Read<span class="colon">:</span></dt>
|
||
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">gray8_image_t</span></code>, <code class="docutils literal notranslate"><span class="pre">rgb8_image_t</span></code>, <code class="docutils literal notranslate"><span class="pre">cmyk8_image_t</span></code></p>
|
||
</dd>
|
||
<dt class="field-even">Write<span class="colon">:</span></dt>
|
||
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">gray8_image_t</span></code>, <code class="docutils literal notranslate"><span class="pre">rgb8_image_t</span></code>, <code class="docutils literal notranslate"><span class="pre">cmyk8_image_t</span></code></p>
|
||
</dd>
|
||
</dl>
|
||
<p>Reading YCbCr or YCCK images is possible but might result in inaccuracies since
|
||
both color spaces aren’t available yet for gil.
|
||
For now these color spaces are read as rgb images.
|
||
This is subject to change soon.</p>
|
||
</section>
|
||
<section id="png">
|
||
<h4>PNG<a class="headerlink" href="#png" title="Link to this heading">¶</a></h4>
|
||
<p>For a general overview of the PNG image file format go to the
|
||
following <a class="reference external" href="http://en.wikipedia.org/wiki/Portable_Network_Graphics">PNG_Wiki</a>.</p>
|
||
<p>This png extension is based on the libpng, which can be found
|
||
here, <a class="reference external" href="http://libpng.org/pub/png/libpng.html">PNG_Lib</a>.</p>
|
||
<p>All versions starting from 1.5.x are supported.</p>
|
||
<p>The user has to make sure this library is properly installed.
|
||
I strongly recommend the user to build the library yourself.
|
||
It could potentially save you a lot of trouble.</p>
|
||
<p>Currently the code is able to read and write the following image types:</p>
|
||
<dl class="field-list simple">
|
||
<dt class="field-odd">Read<span class="colon">:</span></dt>
|
||
<dd class="field-odd"><p>gray1, gray2, gray4, gray8, gray16, gray_alpha_8, gray_alpha_16, rgb8, rgb16, rgba8, rgba16</p>
|
||
</dd>
|
||
<dt class="field-even">Write<span class="colon">:</span></dt>
|
||
<dd class="field-even"><p>gray1, gray2, gray4, gray8, gray16, gray_alpha_8, gray_alpha_16, rgb8, rgb16, rgba8, rgba16</p>
|
||
</dd>
|
||
</dl>
|
||
<p>For reading gray_alpha images the user has to compile application with <code class="docutils literal notranslate"><span class="pre">BOOST_GIL_IO_ENABLE_GRAY_ALPHA</span></code>
|
||
macro defined. This color space is defined in the toolbox by using <code class="docutils literal notranslate"><span class="pre">gray_alpha.hpp</span></code>.</p>
|
||
</section>
|
||
<section id="pnm">
|
||
<h4>PNM<a class="headerlink" href="#pnm" title="Link to this heading">¶</a></h4>
|
||
<p>For a general overview of the PNM image file format go to the
|
||
following <a class="reference external" href="http://en.wikipedia.org/wiki/Portable_anymap">PNM_Wiki</a>. No external library is needed for the pnm format.</p>
|
||
<p>The extension can read images in both flavours of the formats, ASCII and binary,
|
||
that is types from P1 through P6; can write only binary formats.</p>
|
||
<p>Currently the code is able to read and write the following image types:</p>
|
||
<dl class="field-list simple">
|
||
<dt class="field-odd">Read<span class="colon">:</span></dt>
|
||
<dd class="field-odd"><p>gray1, gray8, rgb8</p>
|
||
</dd>
|
||
<dt class="field-even">Write<span class="colon">:</span></dt>
|
||
<dd class="field-even"><p>gray1, gray8, rgb8</p>
|
||
</dd>
|
||
</dl>
|
||
<p>When reading a mono text image the data is read as a gray8 image.</p>
|
||
</section>
|
||
<section id="raw">
|
||
<h4>RAW<a class="headerlink" href="#raw" title="Link to this heading">¶</a></h4>
|
||
<p>For a general overview see <a class="reference external" href="http://en.wikipedia.org/wiki/Raw_image_format">RAW_Wiki</a>.</p>
|
||
<p>Currently the extension is only able to read rgb8 images.</p>
|
||
</section>
|
||
<section id="targa">
|
||
<h4>TARGA<a class="headerlink" href="#targa" title="Link to this heading">¶</a></h4>
|
||
<p>For a general overview of the BMP image file format go to the
|
||
following <a class="reference external" href="http://en.wikipedia.org/wiki/Truevision_TGA">TARGA_Wiki</a>.</p>
|
||
<p>Currently the code is able to read and write the following image types:</p>
|
||
<dl class="field-list simple">
|
||
<dt class="field-odd">Read<span class="colon">:</span></dt>
|
||
<dd class="field-odd"><p>rgb8_image_t and rgba8_image_t</p>
|
||
</dd>
|
||
<dt class="field-even">Write<span class="colon">:</span></dt>
|
||
<dd class="field-even"><p>rgb8_image_t and rgba8_image_t</p>
|
||
</dd>
|
||
</dl>
|
||
<p>The lack of having an indexed image type in gil restricts the current
|
||
interface to only write out non-indexed images.
|
||
This is subject to change soon.</p>
|
||
</section>
|
||
<section id="tiff">
|
||
<h4>TIFF<a class="headerlink" href="#tiff" title="Link to this heading">¶</a></h4>
|
||
<p>For a general overview of the TIFF image file format go to the
|
||
following <a class="reference external" href="http://en.wikipedia.org/wiki/Tagged_Image_File_Format">TIFF_Wiki</a>.</p>
|
||
<p>This tiff extension is based on the libtiff, which can be found, <a class="reference external" href="http://www.remotesensing.org/libtiff/">TIFF_Lib</a>.</p>
|
||
<p>All versions starting from 3.9.x are supported.</p>
|
||
<p>The user has to make sure this library is properly installed. I strongly
|
||
recommend the user to build the library yourself. It could potentially
|
||
save you a lot of trouble.</p>
|
||
<p>TIFF images can virtually encode all kinds of channel sizes representing
|
||
various color spaces. Even planar images are possible.
|
||
For instance, <code class="docutils literal notranslate"><span class="pre">rbg323</span></code> or <code class="docutils literal notranslate"><span class="pre">gray7</span></code>. The channels also can have specific
|
||
formats, like integer values or floating point values.</p>
|
||
<p>For a complete set of options please consult the following websites:</p>
|
||
<ul class="simple">
|
||
<li><p><a class="reference external" href="http://www.awaresystems.be/imaging/tiff/tifftags/baseline.html">TIFF_Base_Tags</a></p></li>
|
||
<li><p><a class="reference external" href="http://www.awaresystems.be/imaging/tiff/tifftags/extension.html">TIFF_Extension_Tags</a></p></li>
|
||
</ul>
|
||
<p>The author of this extension is not claiming all tiff formats are supported.
|
||
This extension is likely to be a moving target adding new features with each
|
||
new milestone. Here is an incomplete list:</p>
|
||
<ul class="simple">
|
||
<li><p>Multi-page TIFF - read only</p></li>
|
||
<li><p>Strip TIFF - read and write support</p></li>
|
||
<li><p>Tiled TIFF - read and write support with user defined tiled sizes</p></li>
|
||
<li><p>Bit images TIFF - fully supported, like <code class="docutils literal notranslate"><span class="pre">gray1_image_t</span></code> (minisblack)</p></li>
|
||
<li><p>Planar TIFF - fully supported</p></li>
|
||
<li><p>Floating-point TIFF - fully supported</p></li>
|
||
<li><p>Palette TIFF - supported but no indexed image type is available as of now</p></li>
|
||
</ul>
|
||
<p>This gil extension uses two different test image suites to test read and
|
||
write capabilities. See <code class="docutils literal notranslate"><span class="pre">test_image</span></code> folder.
|
||
It’s advisable to use ImageMagick test viewer to display images.</p>
|
||
</section>
|
||
</section>
|
||
<section id="extending-gil-io-with-new-formats">
|
||
<h3>Extending GIL::IO with new Formats<a class="headerlink" href="#extending-gil-io-with-new-formats" title="Link to this heading">¶</a></h3>
|
||
<p>Extending the gil::io with new formats is meant to be simple and
|
||
straightforward. Before adding I would recommend to have a look at existing
|
||
implementations and then trying to follow a couple of guidelines:</p>
|
||
<ul>
|
||
<li><dl class="simple">
|
||
<dt>Create the following files for your new xxx format</dt><dd><ul class="simple">
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">xxx_read.hpp</span></code> - only includes read code</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">xxx_write.hpp</span></code> - only includes write code</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">xxx_all.hpp</span></code> - includes xxx_read.hpp and xxx_write.hpp</p></li>
|
||
</ul>
|
||
</dd>
|
||
</dl>
|
||
</li>
|
||
<li><p>Add the code to the <code class="docutils literal notranslate"><span class="pre">boost::gil::detail</span></code> namespace</p></li>
|
||
<li><p>Create a tag type for the new format. Like this:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">xxx_tag</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">format_tag</span><span class="w"> </span><span class="p">{};</span>
|
||
</pre></div>
|
||
</div>
|
||
</li>
|
||
<li><p>Create the image_read_info for the new format. It contains all the
|
||
information that is necessary to read an image. It should be filled
|
||
and returned by the <code class="docutils literal notranslate"><span class="pre">get_info</span></code> member of the reader class. See below:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="k">template</span><span class="o"><></span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">image_read_info</span><span class="o"><</span><span class="w"> </span><span class="n">xxx_tag</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="p">{};</span>
|
||
</pre></div>
|
||
</div>
|
||
</li>
|
||
<li><p>Create the image_write_info for the new format. It contains all the
|
||
information that is necessary to write an image:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="k">template</span><span class="o"><></span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">image_write_info</span><span class="o"><</span><span class="w"> </span><span class="n">xxx_tag</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="p">{};</span>
|
||
</pre></div>
|
||
</div>
|
||
</li>
|
||
<li><p>Use the following reader skeleton as a start:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="k">template</span><span class="o"><</span><span class="w"> </span><span class="k">typename</span><span class="w"> </span><span class="nc">Device</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="k">typename</span><span class="w"> </span><span class="nc">ConversionPolicy</span>
|
||
<span class="w"> </span><span class="o">></span>
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">reader</span><span class="o"><</span><span class="w"> </span><span class="n">Device</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">xxx_tag</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">ConversionPolicy</span>
|
||
<span class="w"> </span><span class="o">></span>
|
||
<span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">reader_base</span><span class="o"><</span><span class="w"> </span><span class="n">xxx_tag</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">ConversionPolicy</span>
|
||
<span class="w"> </span><span class="o">></span>
|
||
<span class="p">{</span>
|
||
<span class="k">private</span><span class="o">:</span>
|
||
|
||
<span class="w"> </span><span class="k">typedef</span><span class="w"> </span><span class="k">typename</span><span class="w"> </span><span class="nc">ConversionPolicy</span><span class="o">::</span><span class="n">color_converter_type</span><span class="w"> </span><span class="n">cc_t</span><span class="p">;</span>
|
||
|
||
<span class="k">public</span><span class="o">:</span>
|
||
|
||
<span class="w"> </span><span class="n">reader</span><span class="p">(</span><span class="w"> </span><span class="n">Device</span><span class="o">&</span><span class="w"> </span><span class="n">device</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">_io_dev</span><span class="p">(</span><span class="w"> </span><span class="n">device</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">{}</span>
|
||
|
||
<span class="w"> </span><span class="n">reader</span><span class="p">(</span><span class="w"> </span><span class="n">Device</span><span class="o">&</span><span class="w"> </span><span class="n">device</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">cc_t</span><span class="o">&</span><span class="w"> </span><span class="n">cc</span>
|
||
<span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">_io_dev</span><span class="p">(</span><span class="w"> </span><span class="n">device</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">reader_base</span><span class="o"><</span><span class="w"> </span><span class="n">xxx_tag</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">ConversionPolicy</span>
|
||
<span class="w"> </span><span class="o">></span><span class="p">(</span><span class="w"> </span><span class="n">cc</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">{}</span>
|
||
|
||
<span class="w"> </span><span class="n">image_read_info</span><span class="o"><</span><span class="w"> </span><span class="n">xxx_tag</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">get_info</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="p">{</span>
|
||
<span class="w"> </span><span class="c1">// your implementation here</span>
|
||
<span class="w"> </span><span class="p">}</span>
|
||
|
||
<span class="w"> </span><span class="k">template</span><span class="o"><</span><span class="w"> </span><span class="k">typename</span><span class="w"> </span><span class="nc">View</span><span class="w"> </span><span class="o">></span>
|
||
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">apply</span><span class="p">(</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">View</span><span class="o">&</span><span class="w"> </span><span class="n">dst_view</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">{</span>
|
||
<span class="w"> </span><span class="c1">// your implementation here</span>
|
||
<span class="w"> </span><span class="p">}</span>
|
||
<span class="p">};</span>
|
||
</pre></div>
|
||
</div>
|
||
</li>
|
||
<li><p>The writer skeleton:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="k">template</span><span class="o"><</span><span class="w"> </span><span class="k">typename</span><span class="w"> </span><span class="nc">Device</span><span class="w"> </span><span class="o">></span>
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">writer</span><span class="o"><</span><span class="w"> </span><span class="n">Device</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">xxx_tag</span>
|
||
<span class="w"> </span><span class="o">></span>
|
||
<span class="p">{</span>
|
||
<span class="k">public</span><span class="o">:</span>
|
||
|
||
<span class="w"> </span><span class="n">writer</span><span class="p">(</span><span class="w"> </span><span class="n">Device</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">out</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">{}</span>
|
||
|
||
<span class="w"> </span><span class="k">template</span><span class="o"><</span><span class="k">typename</span><span class="w"> </span><span class="nc">View</span><span class="o">></span>
|
||
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">apply</span><span class="p">(</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">View</span><span class="o">&</span><span class="w"> </span><span class="n">view</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">{</span>
|
||
<span class="w"> </span><span class="c1">// your implementation here</span>
|
||
<span class="w"> </span><span class="p">}</span>
|
||
|
||
<span class="w"> </span><span class="k">template</span><span class="o"><</span><span class="k">typename</span><span class="w"> </span><span class="nc">View</span><span class="o">></span>
|
||
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">apply</span><span class="p">(</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">View</span><span class="o">&</span><span class="w"> </span><span class="n">view</span>
|
||
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">image_write_info</span><span class="o"><</span><span class="w"> </span><span class="n">xxx_tag</span><span class="w"> </span><span class="o">>&</span><span class="w"> </span><span class="n">info</span><span class="w"> </span><span class="p">)</span>
|
||
<span class="w"> </span><span class="p">{</span>
|
||
<span class="w"> </span><span class="c1">// your implementation here</span>
|
||
<span class="w"> </span><span class="p">}</span>
|
||
<span class="p">};</span>
|
||
</pre></div>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</section>
|
||
</section>
|
||
<section id="running-gil-io-tests">
|
||
<h2>Running gil::io tests<a class="headerlink" href="#running-gil-io-tests" title="Link to this heading">¶</a></h2>
|
||
<p>gil::io comes with a large suite of test cases which reads and writes various
|
||
file formats. It uses some test image suites which can be found online or
|
||
which can be demanded from me by sending me an email.</p>
|
||
<p>There are some test images created by me in the test folder.
|
||
To enable unit tests which make use of them set the following compiler options
|
||
<code class="docutils literal notranslate"><span class="pre">BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES</span></code> and
|
||
<code class="docutils literal notranslate"><span class="pre">BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES</span></code>.</p>
|
||
<p>The following list provides all links to the image suites the compiler symbol
|
||
to enable the tests:</p>
|
||
<dl class="field-list simple">
|
||
<dt class="field-odd">BMP<span class="colon">:</span></dt>
|
||
<dd class="field-odd"><p><a class="reference external" href="http://entropymine.com/jason/bmpsuite/">BMP_TEST_FILES</a> – BOOST_GIL_IO_USE_BMP_TEST_SUITE_IMAGES</p>
|
||
</dd>
|
||
<dt class="field-even">PNG<span class="colon">:</span></dt>
|
||
<dd class="field-even"><p><a class="reference external" href="http://www.schaik.com/pngsuite/pngsuite.html">PNG_TEST_FILES</a> – BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES</p>
|
||
</dd>
|
||
<dt class="field-odd">PNM<span class="colon">:</span></dt>
|
||
<dd class="field-odd"><p>request files from me – BOOST_GIL_IO_USE_PNM_TEST_SUITE_IMAGES</p>
|
||
</dd>
|
||
<dt class="field-even">TIFF<span class="colon">:</span></dt>
|
||
<dd class="field-even"><p><a class="reference external" href="http://www.remotesensing.org/libtiff/images.html">TIFF_LIB_TIFF_TEST_FILES</a> – BOOST_GIL_IO_USE_TIFF_LIBTIFF_TEST_SUITE_IMAGES</p>
|
||
</dd>
|
||
<dt class="field-odd">TIFF<span class="colon">:</span></dt>
|
||
<dd class="field-odd"><p><a class="reference external" href="ftp://ftp.graphicsmagick.org/pub/tiff-samples/tiff-sample-images-be.tar.gz">TIFF_GRAPHICSMAGICK_TEST_FILES</a> – BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES</p>
|
||
</dd>
|
||
</dl>
|
||
</section>
|
||
</section>
|
||
|
||
|
||
<div class="navbar" style="text-align:right;">
|
||
|
||
|
||
<a class="prev" title="STD extension" href="histogram/extension/std.html"><img src="_static/prev.png" alt="prev"/></a>
|
||
<a class="next" title="ToolBox extension" href="toolbox.html"><img src="_static/next.png" alt="next"/></a>
|
||
|
||
</div>
|
||
</div>
|
||
<div class="footer" role="contentinfo">
|
||
Last updated on 2026-01-23 01:01:39.
|
||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 7.2.6.
|
||
</div>
|
||
</body>
|
||
</html> |