123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758 |
- <!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" />
-
- <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/jquery.js"></script>
- <script type="text/javascript" src="_static/underscore.js"></script>
- <script type="text/javascript" src="_static/doctools.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="Affine region detectors" href="image_processing/affine-region-detectors.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="Affine region detectors" href="image_processing/affine-region-detectors.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 class="section" id="io-extensions">
- <h1>IO extensions</h1>
- <div class="section" id="overview">
- <h2>Overview</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>
- </div>
- <div class="section" id="supported-platforms">
- <h2>Supported Platforms</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>libtiff</li>
- <li>libjpeg</li>
- <li>libpng</li>
- <li>libraw</li>
- <li>zlib</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>
- </div>
- <div class="section" id="tutorial">
- <h2>Tutorial</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>
- <div class="section" id="reading-an-image">
- <h3>Reading An Image</h3>
- <p>Probably the most common case to read a tiff image can be done as follows:</p>
- <div class="highlight-c++"><div class="highlight"><pre><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">filename</span><span class="p">(</span> <span class="s">"image.tif"</span> <span class="p">);</span>
- <span class="n">rgb8_image_t</span> <span class="n">img</span><span class="p">;</span>
- <span class="n">read_image</span><span class="p">(</span> <span class="n">filename</span><span class="p">,</span> <span class="n">img</span><span class="p">,</span> <span class="n">tiff_tag</span><span class="p">()</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"><span class="pre">read_view</span></code> or
- <code class="docutils literal"><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++"><div class="highlight"><pre><span class="n">read_image</span><span class="p">(</span> <span class="n">filename</span>
- <span class="p">,</span> <span class="n">img</span>
- <span class="p">,</span> <span class="n">image_read_settings</span><span class="o"><</span> <span class="n">tiff_tag</span> <span class="o">></span><span class="p">(</span> <span class="n">point_t</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span> <span class="p">),</span> <span class="n">point_t</span><span class="p">(</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">50</span> <span class="p">)</span> <span class="p">)</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 serves 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>
- </div>
- <div class="section" id="writing-an-image">
- <h3>Writing An Image</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++"><div class="highlight"><pre><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">filename</span><span class="p">(</span> <span class="s">"image.tif"</span> <span class="p">);</span>
- <span class="n">rgb8_image_t</span> <span class="nf">img</span><span class="p">(</span> <span class="mi">640</span><span class="p">,</span> <span class="mi">480</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="n">filename</span>
- <span class="p">,</span> <span class="n">view</span><span class="p">(</span> <span class="n">img</span> <span class="p">)</span>
- <span class="p">,</span> <span class="n">tiff_tag</span><span class="p">()</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"><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++"><div class="highlight"><pre><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">filename</span><span class="p">(</span> <span class="s">"image.jpg"</span> <span class="p">);</span>
- <span class="n">rgb8_image_t</span> <span class="nf">img</span><span class="p">(</span> <span class="mi">640</span><span class="p">,</span> <span class="mi">480</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="n">filename</span>
- <span class="p">,</span> <span class="n">view</span><span class="p">(</span> <span class="n">img</span> <span class="p">)</span>
- <span class="p">,</span> <span class="n">image_write_info</span><span class="o"><</span> <span class="n">jpeg_tag</span> <span class="o">></span><span class="p">(</span> <span class="mi">95</span> <span class="p">)</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>
- </div>
- <div class="section" id="reading-and-writing-in-memory-buffers">
- <h3>Reading And Writing In-Memory Buffers</h3>
- <p>Reading and writing in-memory buffers are supported as well. See as follows:</p>
- <div class="highlight-c++"><div class="highlight"><pre><span class="c1">// 1. Read an image.</span>
- <span class="n">ifstream</span> <span class="nf">in</span><span class="p">(</span> <span class="s">"test.tif"</span><span class="p">,</span> <span class="n">ios</span><span class="o">::</span><span class="n">binary</span> <span class="p">);</span>
- <span class="n">rgb8_image_t</span> <span class="n">img</span><span class="p">;</span>
- <span class="n">read_image</span><span class="p">(</span> <span class="n">in</span><span class="p">,</span> <span class="n">img</span><span class="p">,</span> <span class="n">tiff_tag</span><span class="p">()</span> <span class="p">);</span>
- <span class="c1">// 2. Write image to in-memory buffer.</span>
- <span class="n">stringstream</span> <span class="nf">out_buffer</span><span class="p">(</span> <span class="n">ios_base</span><span class="o">::</span><span class="n">out</span> <span class="o">|</span> <span class="n">ios_base</span><span class="o">::</span><span class="n">binary</span> <span class="p">);</span>
- <span class="n">rgb8_image_t</span> <span class="n">src</span><span class="p">;</span>
- <span class="n">write_view</span><span class="p">(</span> <span class="n">out_buffer</span><span class="p">,</span> <span class="n">view</span><span class="p">(</span> <span class="n">src</span> <span class="p">),</span> <span class="n">tiff_tag</span><span class="p">()</span> <span class="p">);</span>
- <span class="c1">// 3. Copy in-memory buffer to another.</span>
- <span class="n">stringstream</span> <span class="nf">in_buffer</span><span class="p">(</span> <span class="n">ios_base</span><span class="o">::</span><span class="n">in</span> <span class="o">|</span> <span class="n">ios_base</span><span class="o">::</span><span class="n">binary</span> <span class="p">);</span>
- <span class="n">in_buffer</span> <span class="o"><<</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="n">dst</span><span class="p">;</span>
- <span class="n">read_image</span><span class="p">(</span> <span class="n">in_buffer</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">tag_t</span><span class="p">()</span> <span class="p">);</span>
- <span class="c1">// 5. Write out image.</span>
- <span class="n">string</span> <span class="nf">filename</span><span class="p">(</span> <span class="s">"out.tif"</span> <span class="p">);</span>
- <span class="n">ofstream</span> <span class="nf">out</span><span class="p">(</span> <span class="n">filename</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span> <span class="n">ios_base</span><span class="o">::</span><span class="n">binary</span> <span class="p">);</span>
- <span class="n">write_view</span><span class="p">(</span> <span class="n">out</span><span class="p">,</span> <span class="n">view</span><span class="p">(</span> <span class="n">dst</span> <span class="p">),</span> <span class="n">tiff_tag</span><span class="p">()</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>
- </div>
- </div>
- <div class="section" id="using-io">
- <h2>Using IO</h2>
- <div class="section" id="general-overview">
- <h3>General Overview</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++"><div class="highlight"><pre><span class="k">typedef</span> <span class="n">get_reader_backend</span><span class="o"><</span> <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span>
- <span class="p">,</span> <span class="n">tag_t</span>
- <span class="o">>::</span><span class="n">type</span> <span class="n">backend_t</span><span class="p">;</span>
- <span class="n">backend_t</span> <span class="n">backend</span> <span class="o">=</span> <span class="n">read_image_info</span><span class="p">(</span> <span class="n">bmp_filename</span>
- <span class="p">,</span> <span class="n">tag_t</span><span class="p">()</span>
- <span class="p">);</span>
- <span class="n">BOOST_CHECK_EQUAL</span><span class="p">(</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="p">,</span> <span class="mi">127</span> <span class="p">);</span>
- <span class="n">BOOST_CHECK_EQUAL</span><span class="p">(</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="mi">64</span> <span class="p">);</span>
- </pre></div>
- </div>
- <p>Of course, the typedef can be removed when using c++11’s auto feature.</p>
- </div>
- <div class="section" id="read-interface">
- <h3>Read Interface</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><code class="docutils literal"><span class="pre">read_image</span></code> - read into a gil image with no conversion.
- Memory is allocated.</li>
- <li><code class="docutils literal"><span class="pre">read_view</span></code> - read into a gil view with no conversion.</li>
- <li><code class="docutils literal"><span class="pre">read_and_convert_image</span></code> - read and convert into a gil image.
- Memory is allocated.</li>
- <li><code class="docutils literal"><span class="pre">read_and_convert_view</span></code> - read and convert into a gil view.</li>
- <li><code class="docutils literal"><span class="pre">read_image_info</span></code> - read the image header.</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"><span class="pre">std::string</span></code>,
- <code class="docutils literal"><span class="pre">std::wstring</span></code> and <code class="docutils literal"><span class="pre">boost::filesystem</span></code> path. When using the path
- object the user needs to define the ADD_FS_PATH_SUPPORT compiler symbol to
- include the boost::filesystem dependency.
- Devices could be a <code class="docutils literal"><span class="pre">FILE*</span></code>, <code class="docutils literal"><span class="pre">std::ifstream</span></code>, and <code class="docutils literal"><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"><span class="pre">read_xxx</span></code> function.
- The third and last parameter is either an instance of the
- <code class="docutils literal"><span class="pre">image_read_settings<FormatTag></span></code> or just the <code class="docutils literal"><span class="pre">FormatTag</span></code>.
- The settings can be various depending on the format which is being read.
- But the 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 an example of setting up partial read:</p>
- <div class="highlight-c++"><div class="highlight"><pre><span class="n">read_image</span><span class="p">(</span> <span class="n">filename</span>
- <span class="p">,</span> <span class="n">img</span>
- <span class="p">,</span> <span class="n">image_read_settings</span><span class="o"><</span> <span class="n">tiff_tag</span> <span class="o">></span><span class="p">(</span> <span class="n">point_t</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span> <span class="p">),</span> <span class="n">point_t</span><span class="p">(</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">50</span> <span class="p">)</span> <span class="p">)</span>
- <span class="p">);</span>
- </pre></div>
- </div>
- <p>Each format supports reading just the header information,
- using <code class="docutils literal"><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++"><div class="highlight"><pre><span class="n">image_read_info</span><span class="o"><</span> <span class="n">tiff_t</span> <span class="o">></span> <span class="n">info</span> <span class="o">=</span> <span class="n">read_image_info</span><span class="p">(</span> <span class="n">filename</span>
- <span class="p">,</span> <span class="n">tiff_t</span><span class="p">()</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"><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++"><div class="highlight"><pre><span class="k">typedef</span> <span class="n">mpl</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span> <span class="n">gray8_image_t</span>
- <span class="p">,</span> <span class="n">gray16_image_t</span>
- <span class="p">,</span> <span class="n">rgb8_image_t</span>
- <span class="p">,</span> <span class="n">rgba_image_t</span>
- <span class="o">></span> <span class="n">my_img_types</span><span class="p">;</span>
- <span class="n">any_image</span><span class="o"><</span> <span class="n">my_img_types</span> <span class="o">></span> <span class="n">runtime_image</span><span class="p">;</span>
- <span class="n">read_image</span><span class="p">(</span> <span class="n">filename</span>
- <span class="p">,</span> <span class="n">runtime_image</span>
- <span class="p">,</span> <span class="n">tiff_tag</span><span class="p">()</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"><span class="pre">scanline_reader</span></code> is
- implemented for all supported image formats.
- The <code class="docutils literal"><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++"><div class="highlight"><pre><span class="k">typedef</span> <span class="n">tiff_tag</span> <span class="n">tag_t</span><span class="p">;</span>
- <span class="k">typedef</span> <span class="n">scanline_reader</span><span class="o"><</span> <span class="k">typename</span> <span class="n">get_read_device</span><span class="o"><</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span>
- <span class="p">,</span> <span class="n">tag_t</span>
- <span class="o">>::</span><span class="n">type</span>
- <span class="p">,</span> <span class="n">tag_t</span>
- <span class="o">></span> <span class="n">reader_t</span><span class="p">;</span>
- <span class="n">reader_t</span> <span class="n">reader</span> <span class="o">=</span> <span class="n">make_scanline_reader</span><span class="p">(</span> <span class="s">"C:/boost/libs/gil/test/extension/io/images/tiff/test.tif"</span><span class="p">,</span> <span class="n">tag_t</span><span class="p">()</span> <span class="p">);</span>
- <span class="k">typedef</span> <span class="n">rgba8_image_t</span> <span class="n">image_t</span><span class="p">;</span>
- <span class="n">image_t</span> <span class="nf">dst</span><span class="p">(</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="n">reader</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="n">fill_pixels</span><span class="p">(</span> <span class="n">view</span><span class="p">(</span><span class="n">dst</span><span class="p">),</span> <span class="n">image_t</span><span class="o">::</span><span class="n">value_type</span><span class="p">()</span> <span class="p">);</span>
- <span class="k">typedef</span> <span class="n">reader_t</span><span class="o">::</span><span class="n">iterator_t</span> <span class="n">iterator_t</span><span class="p">;</span>
- <span class="n">iterator_t</span> <span class="n">it</span> <span class="o">=</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="n">end</span> <span class="o">=</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="kt">int</span> <span class="n">row</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">it</span> <span class="o">!=</span> <span class="n">end</span><span class="p">;</span> <span class="o">++</span><span class="n">it</span><span class="p">,</span> <span class="o">++</span><span class="n">row</span> <span class="p">)</span>
- <span class="p">{</span>
- <span class="n">copy_pixels</span><span class="p">(</span> <span class="n">interleaved_view</span><span class="p">(</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="mi">1</span>
- <span class="p">,</span> <span class="p">(</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="p">)</span> <span class="o">*</span><span class="n">it</span>
- <span class="p">,</span> <span class="n">reader</span><span class="p">.</span><span class="n">_scanline_length</span>
- <span class="p">)</span>
- <span class="p">,</span> <span class="n">subimage_view</span><span class="p">(</span> <span class="n">view</span><span class="p">(</span> <span class="n">dst</span> <span class="p">)</span>
- <span class="p">,</span> <span class="mi">0</span>
- <span class="p">,</span> <span class="n">row</span>
- <span class="p">,</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="mi">1</span>
- <span class="p">)</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>
- </div>
- <div class="section" id="write-interface">
- <h3>Write Interface</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"><span class="pre">std::string</span></code>,
- <code class="docutils literal"><span class="pre">std::wstring</span></code>, and <code class="docutils literal"><span class="pre">boost::filesystem</span></code> path. When using the path object
- the user needs to define the <code class="docutils literal"><span class="pre">ADD_FS_PATH_SUPPORT</span></code> compiler symbol to
- include the <code class="docutils literal"><span class="pre">boost::filesystem</span></code> dependency.
- Devices could be <code class="docutils literal"><span class="pre">FILE*</span></code>, <code class="docutils literal"><span class="pre">std::ifstream</span></code>, and <code class="docutils literal"><span class="pre">TIFF*</span></code> for TIFF images.</p>
- <p>The second parameter is an view object to image being written.
- The third and last parameter is either a tag or an
- <code class="docutils literal"><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++"><div class="highlight"><pre><span class="k">typedef</span> <span class="n">mpl</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span> <span class="n">gray8_image_t</span>
- <span class="p">,</span> <span class="n">gray16_image_t</span>
- <span class="p">,</span> <span class="n">rgb8_image_t</span>
- <span class="p">,</span> <span class="n">rgba_image_t</span>
- <span class="o">></span> <span class="n">my_img_types</span><span class="p">;</span>
- <span class="n">any_image</span><span class="o"><</span> <span class="n">my_img_types</span> <span class="o">></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="n">filename</span>
- <span class="p">,</span> <span class="n">view</span><span class="p">(</span> <span class="n">runtime_image</span> <span class="p">)</span>
- <span class="p">,</span> <span class="n">tiff_tag</span><span class="p">()</span>
- <span class="p">);</span>
- </pre></div>
- </div>
- </div>
- <div class="section" id="compiler-symbols">
- <h3>Compiler Symbols</h3>
- <p>The following table gives an overview of all supported compiler symbols
- that can be set by the user:</p>
- <table border="1" class="docutils">
- <colgroup>
- <col width="34%" />
- <col width="66%" />
- </colgroup>
- <thead valign="bottom">
- <tr class="row-odd"><th class="head">Symbol</th>
- <th class="head">Description</th>
- </tr>
- </thead>
- <tbody valign="top">
- <tr class="row-even"><td>BOOST_GIL_IO_ENABLE_GRAY_ALPHA</td>
- <td>Enable the color space “gray_alpha”.</td>
- </tr>
- <tr class="row-odd"><td>BOOST_GIL_IO_ADD_FS_PATH_SUPPORT</td>
- <td>Enable boost::filesystem 3.0 library.</td>
- </tr>
- <tr class="row-even"><td>BOOST_GIL_IO_PNG_FLOATING_POINT_SUPPORTED</td>
- <td>Use libpng in floating point mode. This symbol is incompatible with BOOST_GIL_IO_PNG_FIXED_POINT_SUPPORTED.</td>
- </tr>
- <tr class="row-odd"><td>BOOST_GIL_IO_PNG_FIXED_POINT_SUPPORTED</td>
- <td>Use libpng in integer mode. This symbol is incompatible with BOOST_GIL_IO_PNG_FLOATING_POINT_SUPPORTED.</td>
- </tr>
- <tr class="row-even"><td>BOOST_GIL_IO_PNG_DITHERING_SUPPORTED</td>
- <td>Look up “dithering” in libpng manual for explanation.</td>
- </tr>
- <tr class="row-odd"><td>BOOST_GIL_IO_PNG_1_4_OR_LOWER</td>
- <td>Allow compiling with libpng 1.4 or lower.</td>
- </tr>
- <tr class="row-even"><td>BOOST_GIL_EXTENSION_IO_JPEG_C_LIB_COMPILED_AS_CPLUSPLUS</td>
- <td>libjpeg is compiled as c++ lib.</td>
- </tr>
- <tr class="row-odd"><td>BOOST_GIL_EXTENSION_IO_PNG_C_LIB_COMPILED_AS_CPLUSPLUS</td>
- <td>libpng is compiled as c++ lib.</td>
- </tr>
- <tr class="row-even"><td>BOOST_GIL_EXTENSION_IO_TIFF_C_LIB_COMPILED_AS_CPLUSPLUS</td>
- <td>libtiff is compiled as c++ lib.</td>
- </tr>
- <tr class="row-odd"><td>BOOST_GIL_EXTENSION_IO_ZLIB_C_LIB_COMPILED_AS_CPLUSPLUS</td>
- <td>zlib is compiled as c++ lib.</td>
- </tr>
- <tr class="row-even"><td>BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES</td>
- <td>Allow basic test images to be read from local hard drive. The paths can be set in paths.hpp</td>
- </tr>
- <tr class="row-odd"><td>BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES</td>
- <td>Allow images to be written to the local hard drive. The paths can be set in paths.hpp</td>
- </tr>
- <tr class="row-even"><td>BOOST_GIL_IO_USE_BMP_TEST_SUITE_IMAGES</td>
- <td>Run tests using the bmp test images suite. See _BMP_TEST_FILES</td>
- </tr>
- <tr class="row-odd"><td>BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES</td>
- <td>Run tests using the png test images suite. See _PNG_TEST_FILES</td>
- </tr>
- <tr class="row-even"><td>BOOST_GIL_IO_USE_PNM_TEST_SUITE_IMAGES</td>
- <td>Run tests using the pnm test images suite. Send me an email for accessing the files.</td>
- </tr>
- <tr class="row-odd"><td>BOOST_GIL_IO_USE_TARGA_FILEFORMAT_TEST_SUITE_IMAGES</td>
- <td>Run tests using the targa file format test images suite. See _TARGA_TEST_FILES</td>
- </tr>
- <tr class="row-even"><td>BOOST_GIL_IO_USE_TIFF_LIBTIFF_TEST_SUITE_IMAGES</td>
- <td>Run tests using the targa file format test images suite. See _TIFF_LIB_TIFF_TEST_FILES</td>
- </tr>
- <tr class="row-odd"><td>BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES</td>
- <td>Run tests using the targa file format test images suite. See _TIFF_GRAPHICSMAGICK_TEST_FILES</td>
- </tr>
- </tbody>
- </table>
- </div>
- <div class="section" id="supported-image-formats">
- <h3>Supported Image Formats</h3>
- <div class="section" id="bmp">
- <h4>BMP</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 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>
- <table class="docutils field-list" frame="void" rules="none">
- <col class="field-name" />
- <col class="field-body" />
- <tbody valign="top">
- <tr class="field-odd field"><th class="field-name">Read:</th><td class="field-body"><code class="docutils literal"><span class="pre">gray1_image_t</span></code>, <code class="docutils literal"><span class="pre">gray4_image_t</span></code>, <code class="docutils literal"><span class="pre">gray8_image_t</span></code>, <code class="docutils literal"><span class="pre">rgb8_image_t</span></code> and, <code class="docutils literal"><span class="pre">rgba8_image_t</span></code></td>
- </tr>
- <tr class="field-even field"><th class="field-name">Write:</th><td class="field-body"><code class="docutils literal"><span class="pre">rgb8_image_t</span></code> and, <code class="docutils literal"><span class="pre">rgba8_image_t</span></code></td>
- </tr>
- </tbody>
- </table>
- <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>
- </div>
- <div class="section" id="jpeg">
- <h4>JPEG</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>
- <table class="docutils field-list" frame="void" rules="none">
- <col class="field-name" />
- <col class="field-body" />
- <tbody valign="top">
- <tr class="field-odd field"><th class="field-name">Read:</th><td class="field-body"><code class="docutils literal"><span class="pre">gray8_image_t</span></code>, <code class="docutils literal"><span class="pre">rgb8_image_t</span></code>, <code class="docutils literal"><span class="pre">cmyk8_image_t</span></code></td>
- </tr>
- <tr class="field-even field"><th class="field-name">Write:</th><td class="field-body"><code class="docutils literal"><span class="pre">gray8_image_t</span></code>, <code class="docutils literal"><span class="pre">rgb8_image_t</span></code>, <code class="docutils literal"><span class="pre">cmyk8_image_t</span></code></td>
- </tr>
- </tbody>
- </table>
- <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 space are read as rgb images.
- This is subject to change soon.</p>
- </div>
- <div class="section" id="png">
- <h4>PNG</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>
- <table class="docutils field-list" frame="void" rules="none">
- <col class="field-name" />
- <col class="field-body" />
- <tbody valign="top">
- <tr class="field-odd field"><th class="field-name">Read:</th><td class="field-body">gray1, gray2, gray4, gray8, gray16, gray_alpha_8, gray_alpha_16, rgb8, rgb16, rgba8, rgba16</td>
- </tr>
- <tr class="field-even field"><th class="field-name">Write:</th><td class="field-body">gray1, gray2, gray4, gray8, gray16, gray_alpha_8, gray_alpha_16, rgb8, rgb16, rgba8, rgba16</td>
- </tr>
- </tbody>
- </table>
- <p>For reading gray_alpha images the user has to compile application with <code class="docutils literal"><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"><span class="pre">gray_alpha.hpp</span></code>.</p>
- </div>
- <div class="section" id="pnm">
- <h4>PNM</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>
- <table class="docutils field-list" frame="void" rules="none">
- <col class="field-name" />
- <col class="field-body" />
- <tbody valign="top">
- <tr class="field-odd field"><th class="field-name">Read:</th><td class="field-body">gray1, gray8, rgb8</td>
- </tr>
- <tr class="field-even field"><th class="field-name">Write:</th><td class="field-body">gray1, gray8, rgb8</td>
- </tr>
- </tbody>
- </table>
- <p>When reading a mono text image the data is read as a gray8 image.</p>
- </div>
- <div class="section" id="raw">
- <h4>RAW</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>
- </div>
- <div class="section" id="targa">
- <h4>TARGA</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>
- <table class="docutils field-list" frame="void" rules="none">
- <col class="field-name" />
- <col class="field-body" />
- <tbody valign="top">
- <tr class="field-odd field"><th class="field-name">Read:</th><td class="field-body">rgb8_image_t and rgba8_image_t</td>
- </tr>
- <tr class="field-even field"><th class="field-name">Write:</th><td class="field-body">rgb8_image_t and rgba8_image_t</td>
- </tr>
- </tbody>
- </table>
- <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>
- </div>
- <div class="section" id="tiff">
- <h4>TIFF</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"><span class="pre">rbg323</span></code> or <code class="docutils literal"><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><a class="reference external" href="http://www.awaresystems.be/imaging/tiff/tifftags/baseline.html">TIFF_Base_Tags</a></li>
- <li><a class="reference external" href="http://www.awaresystems.be/imaging/tiff/tifftags/extension.html">TIFF_Extension_Tags</a></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 lists:</p>
- <ul class="simple">
- <li>Multi-page TIFF - read only</li>
- <li>Strip TIFF - read and write support</li>
- <li>Tiled TIFF - read and write support with user defined tiled sizes</li>
- <li>Bit images TIFF - fully supported, like <code class="docutils literal"><span class="pre">gray1_image_t</span></code> (minisblack)</li>
- <li>Planar TIFF - fully supported</li>
- <li>Floating-point TIFF - fully supported</li>
- <li>Palette TIFF - supported but no indexed image type is available as of now</li>
- </ul>
- <p>This gil extension uses two different test image suites to test read and
- write capabilities. See <code class="docutils literal"><span class="pre">test_image</span></code> folder.
- It’s advisable to use ImageMagick test viewer to display images.</p>
- </div>
- </div>
- <div class="section" id="extending-gil-io-with-new-formats">
- <h3>Extending GIL::IO with new Formats</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="first docutils">
- <dt>Create the following files for your new xxx format</dt>
- <dd><ul class="first last simple">
- <li><code class="docutils literal"><span class="pre">xxx_read.hpp</span></code> - Only includes read code</li>
- <li><code class="docutils literal"><span class="pre">xxx_write.hpp</span></code> - Only includes write code</li>
- <li><code class="docutils literal"><span class="pre">xxx_all.hpp</span></code> - includes xxx_read.hpp and xxx_write.hpp</li>
- </ul>
- </dd>
- </dl>
- </li>
- <li><p class="first">Add the code to the <code class="docutils literal"><span class="pre">boost::gil::detail</span></code> namespace</p>
- </li>
- <li><p class="first">Create a tag type for the new format. Like this:</p>
- <div class="highlight-c++"><div class="highlight"><pre><span class="k">struct</span> <span class="nl">xxx_tag</span> <span class="p">:</span> <span class="n">format_tag</span> <span class="p">{};</span>
- </pre></div>
- </div>
- </li>
- <li><p class="first">Create the image_read_info for the new format. It contains all the
- information that are necessary to read an image. It should be filled
- and returned by the <code class="docutils literal"><span class="pre">get_info</span></code> member of the reader class. See below:</p>
- <div class="highlight-c++"><div class="highlight"><pre><span class="k">template</span><span class="o"><></span> <span class="k">struct</span> <span class="n">image_read_info</span><span class="o"><</span> <span class="n">xxx_tag</span> <span class="o">></span> <span class="p">{};</span>
- </pre></div>
- </div>
- </li>
- <li><p class="first">Create the image_write_info for the new format. It contains all the
- information that are necessary to write an image:</p>
- <div class="highlight-c++"><div class="highlight"><pre><span class="k">template</span><span class="o"><></span> <span class="k">struct</span> <span class="n">image_write_info</span><span class="o"><</span> <span class="n">xxx_tag</span> <span class="o">></span> <span class="p">{};</span>
- </pre></div>
- </div>
- </li>
- <li><p class="first">Use the following reader skeleton as a start:</p>
- <div class="highlight-c++"><div class="highlight"><pre><span class="k">template</span><span class="o"><</span> <span class="k">typename</span> <span class="n">Device</span>
- <span class="p">,</span> <span class="k">typename</span> <span class="n">ConversionPolicy</span>
- <span class="o">></span>
- <span class="k">class</span> <span class="nc">reader</span><span class="o"><</span> <span class="n">Device</span>
- <span class="p">,</span> <span class="n">xxx_tag</span>
- <span class="p">,</span> <span class="n">ConversionPolicy</span>
- <span class="o">></span>
- <span class="o">:</span> <span class="k">public</span> <span class="n">reader_base</span><span class="o"><</span> <span class="n">xxx_tag</span>
- <span class="p">,</span> <span class="n">ConversionPolicy</span>
- <span class="o">></span>
- <span class="p">{</span>
- <span class="k">private</span><span class="o">:</span>
- <span class="k">typedef</span> <span class="k">typename</span> <span class="n">ConversionPolicy</span><span class="o">::</span><span class="n">color_converter_type</span> <span class="n">cc_t</span><span class="p">;</span>
- <span class="k">public</span><span class="o">:</span>
- <span class="n">reader</span><span class="p">(</span> <span class="n">Device</span><span class="o">&</span> <span class="n">device</span> <span class="p">)</span>
- <span class="o">:</span> <span class="n">_io_dev</span><span class="p">(</span> <span class="n">device</span> <span class="p">)</span>
- <span class="p">{}</span>
- <span class="n">reader</span><span class="p">(</span> <span class="n">Device</span><span class="o">&</span> <span class="n">device</span>
- <span class="p">,</span> <span class="k">const</span> <span class="n">cc_t</span><span class="o">&</span> <span class="n">cc</span>
- <span class="p">)</span>
- <span class="o">:</span> <span class="n">_io_dev</span><span class="p">(</span> <span class="n">device</span> <span class="p">)</span>
- <span class="p">,</span> <span class="n">reader_base</span><span class="o"><</span> <span class="n">xxx_tag</span>
- <span class="p">,</span> <span class="n">ConversionPolicy</span>
- <span class="o">></span><span class="p">(</span> <span class="n">cc</span> <span class="p">)</span>
- <span class="p">{}</span>
- <span class="n">image_read_info</span><span class="o"><</span> <span class="n">xxx_tag</span> <span class="o">></span> <span class="n">get_info</span><span class="p">()</span>
- <span class="p">{</span>
- <span class="c1">// your implementation here</span>
- <span class="p">}</span>
- <span class="k">template</span><span class="o"><</span> <span class="k">typename</span> <span class="n">View</span> <span class="o">></span>
- <span class="kt">void</span> <span class="n">apply</span><span class="p">(</span> <span class="k">const</span> <span class="n">View</span><span class="o">&</span> <span class="n">dst_view</span> <span class="p">)</span>
- <span class="p">{</span>
- <span class="c1">// your implementation here</span>
- <span class="p">}</span>
- <span class="p">};</span>
- </pre></div>
- </div>
- </li>
- <li><p class="first">The writer skeleton:</p>
- <div class="highlight-c++"><div class="highlight"><pre><span class="k">template</span><span class="o"><</span> <span class="k">typename</span> <span class="n">Device</span> <span class="o">></span>
- <span class="k">class</span> <span class="nc">writer</span><span class="o"><</span> <span class="n">Device</span>
- <span class="p">,</span> <span class="n">xxx_tag</span>
- <span class="o">></span>
- <span class="p">{</span>
- <span class="k">public</span><span class="o">:</span>
- <span class="n">writer</span><span class="p">(</span> <span class="n">Device</span> <span class="o">&</span> <span class="n">file</span> <span class="p">)</span>
- <span class="o">:</span> <span class="n">out</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
- <span class="p">{}</span>
- <span class="k">template</span><span class="o"><</span><span class="k">typename</span> <span class="n">View</span><span class="o">></span>
- <span class="kt">void</span> <span class="n">apply</span><span class="p">(</span> <span class="k">const</span> <span class="n">View</span><span class="o">&</span> <span class="n">view</span> <span class="p">)</span>
- <span class="p">{</span>
- <span class="c1">// your implementation here</span>
- <span class="p">}</span>
- <span class="k">template</span><span class="o"><</span><span class="k">typename</span> <span class="n">View</span><span class="o">></span>
- <span class="kt">void</span> <span class="n">apply</span><span class="p">(</span> <span class="k">const</span> <span class="n">View</span><span class="o">&</span> <span class="n">view</span>
- <span class="p">,</span> <span class="k">const</span> <span class="n">image_write_info</span><span class="o"><</span> <span class="n">xxx_tag</span> <span class="o">>&</span> <span class="n">info</span> <span class="p">)</span>
- <span class="p">{</span>
- <span class="c1">// your implementation here</span>
- <span class="p">}</span>
- <span class="p">};</span>
- </pre></div>
- </div>
- </li>
- </ul>
- </div>
- </div>
- <div class="section" id="running-gil-io-tests">
- <h2>Running gil::io tests</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"><span class="pre">BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES</span></code> and
- <code class="docutils literal"><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>
- <table class="docutils field-list" frame="void" rules="none">
- <col class="field-name" />
- <col class="field-body" />
- <tbody valign="top">
- <tr class="field-odd field"><th class="field-name">BMP:</th><td class="field-body"><a class="reference external" href="http://entropymine.com/jason/bmpsuite/">BMP_TEST_FILES</a> – BOOST_GIL_IO_USE_BMP_TEST_SUITE_IMAGES</td>
- </tr>
- <tr class="field-even field"><th class="field-name">PNG:</th><td class="field-body"><a class="reference external" href="http://www.schaik.com/pngsuite/pngsuite.html">PNG_TEST_FILES</a> – BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES</td>
- </tr>
- <tr class="field-odd field"><th class="field-name">PNM:</th><td class="field-body">request files from me – BOOST_GIL_IO_USE_PNM_TEST_SUITE_IMAGES</td>
- </tr>
- <tr class="field-even field"><th class="field-name">TARGA:</th><td class="field-body"><a class="reference external" href="http://www.fileformat.info/format/tga/sample/index.htm">TARGA_TEST_FILES</a> – BOOST_GIL_IO_USE_TARGA_FILEFORMAT_TEST_SUITE_IMAGES</td>
- </tr>
- <tr class="field-odd field"><th class="field-name">TIFF:</th><td class="field-body"><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</td>
- </tr>
- <tr class="field-even field"><th class="field-name">TIFF:</th><td class="field-body"><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</td>
- </tr>
- </tbody>
- </table>
- </div>
- </div>
- <div class="navbar" style="text-align:right;">
-
-
- <a class="prev" title="Affine region detectors" href="image_processing/affine-region-detectors.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 2019-12-10 00:12:10.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.6.
- </div>
- </body>
- </html>
|