io.rst 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. IO extensions
  2. =============
  3. Overview
  4. --------
  5. This extension to boost::gil provides an easy to use interface for reading and
  6. writing various image formats. It also includes a framework for adding
  7. new formats.
  8. Please see section 3.3 for all supported image formats. A basic tutorial is
  9. provided in section [link gil.io.tutorial Tutorial].
  10. Also, this extension requires Boost version 1.42 and up.
  11. Furthermore the GIL extension Toolbox is used.
  12. For adding new image formats please refer to section
  13. [link gil.io.using_io.extending_gil__io_with_new_formats Extending GIL::IO with new Formats].
  14. Supported Platforms
  15. -------------------
  16. All platforms supported by Boost which have a decent C++ compiler.
  17. Depending on the image format one or more of the following image
  18. libraries might be needed:
  19. * libtiff
  20. * libjpeg
  21. * libpng
  22. * libraw
  23. * zlib
  24. The library is designed to support as many formats as required by the user.
  25. For instance, if the user only needs bmp support none of the above mentioned
  26. dependencies are required.
  27. There are more details available in this documentation on the image format
  28. dependencies. Please see section
  29. [link gil.io.using_io.supported_image_formats Supported Image Formats].
  30. Tutorial
  31. --------
  32. Thanks to modern C++ programming techniques the interface for this library
  33. is rather small and easy to use. In this tutorial I'll give you a short
  34. walk-around on how to use this boost::gil extension.
  35. For more details please refer to section 3.
  36. For each supported IO format a single top-level header file is provided.
  37. For instance, include `boost/gil/extension/io/tiff.hpp` to be able
  38. to read or write TIFF files.
  39. Reading An Image
  40. ~~~~~~~~~~~~~~~~
  41. Probably the most common case to read a tiff image can be done as follows::
  42. std::string filename( "image.tif" );
  43. rgb8_image_t img;
  44. read_image( filename, img, tiff_tag() );
  45. The code would be same for all other image formats. The only thing that needs
  46. to change is the tag type ( tiff_tag ) in the read_image call.
  47. The read_image() expects the supplied image type to be compatible with the
  48. image stored in the file. If the user doesn't know what format an image has she
  49. can use read_and_convert_image().
  50. Another important fact is that read_image() will allocate the appropriate
  51. memory needed for the read operation. There are ``read_view`` or
  52. ``read_and_convert_view`` counterparts, if the memory is already allocated.
  53. Sometimes the user only wants to read a sub-part of an image,
  54. then the above call would look as follows::
  55. read_image( filename
  56. , img
  57. , image_read_settings< tiff_tag >( point_t( 0, 0 ), point_t( 50, 50 ) )
  58. );
  59. The image_read_settings class will provide the user with image format
  60. independent reading setting but can also serves as a pointer for format
  61. dependent settings.
  62. Please see the specific image format sections
  63. [link gil.io.using_io.supported_image_formats Supported Image Formats]
  64. for more details.
  65. Writing An Image
  66. ~~~~~~~~~~~~~~~~
  67. Besides reading the information also writing is the second part of this
  68. Boost.GIL extension. Writing is a lot simpler than reading since an existing
  69. image view contains all the information.
  70. For instance writing an image can be done as follows::
  71. std::string filename( "image.tif" );
  72. rgb8_image_t img( 640, 480 );
  73. // write data into image
  74. write_view( filename
  75. , view( img )
  76. , tiff_tag()
  77. );
  78. The interface is similar to reading an image. To add image format specific
  79. parameter the user can use ``image_write_info`` class.
  80. For instance, a user can specify the JPEG quality when writing like this::
  81. std::string filename( "image.jpg" );
  82. rgb8_image_t img( 640, 480 );
  83. // write data into image
  84. write_view( filename
  85. , view( img )
  86. , image_write_info< jpeg_tag >( 95 )
  87. );
  88. The above example will write an image where the jpeg quality is
  89. set to 95 percent.
  90. Reading And Writing In-Memory Buffers
  91. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  92. Reading and writing in-memory buffers are supported as well. See as follows::
  93. // 1. Read an image.
  94. ifstream in( "test.tif", ios::binary );
  95. rgb8_image_t img;
  96. read_image( in, img, tiff_tag() );
  97. // 2. Write image to in-memory buffer.
  98. stringstream out_buffer( ios_base::out | ios_base::binary );
  99. rgb8_image_t src;
  100. write_view( out_buffer, view( src ), tiff_tag() );
  101. // 3. Copy in-memory buffer to another.
  102. stringstream in_buffer( ios_base::in | ios_base::binary );
  103. in_buffer << out_buffer.rdbuf();
  104. // 4. Read in-memory buffer to gil image
  105. rgb8_image_t dst;
  106. read_image( in_buffer, dst, tag_t() );
  107. // 5. Write out image.
  108. string filename( "out.tif" );
  109. ofstream out( filename.c_str(), ios_base::binary );
  110. write_view( out, view( dst ), tiff_tag() );
  111. In case the user is using his own stream classes he has to make sure it
  112. has the common interface read, write, seek, close, etc. Interface.
  113. Using IO
  114. --------
  115. General Overview
  116. ~~~~~~~~~~~~~~~~
  117. The tutorial pointed out some use cases for reading and writing images in
  118. various image formats. This section will provide a more thorough overview.
  119. The next sections will introduce the Read and Write interface. But it might be
  120. worth pointing out that by using some advanced metaprogramming techniques the
  121. interface is rather small and hopefully easy to understand.
  122. Besides the general interface the user also has the ability to interface
  123. directly with the underlying image format. For that each reader or writer
  124. provides access to the so-called backend.
  125. For instance::
  126. typedef get_reader_backend< const std::string
  127. , tag_t
  128. >::type backend_t;
  129. backend_t backend = read_image_info( bmp_filename
  130. , tag_t()
  131. );
  132. BOOST_CHECK_EQUAL( backend._info._width , 127 );
  133. BOOST_CHECK_EQUAL( backend._info._height, 64 );
  134. Of course, the typedef can be removed when using c++11's auto feature.
  135. Read Interface
  136. ~~~~~~~~~~~~~~
  137. As the Tutorial demonstrated there are a few ways to read images.
  138. Here is an enumeration of all read functions with a short description:
  139. * ``read_image`` - read into a gil image with no conversion.
  140. Memory is allocated.
  141. * ``read_view`` - read into a gil view with no conversion.
  142. * ``read_and_convert_image`` - read and convert into a gil image.
  143. Memory is allocated.
  144. * ``read_and_convert_view`` - read and convert into a gil view.
  145. * ``read_image_info`` - read the image header.
  146. Conversion in this context is necessary if the source (file) has an
  147. incompatible color space with the destination (gil image type).
  148. If that's the case the user has to use the xxx_and_convert_xxx variants.
  149. All functions take the filename or a device as the first parameter.
  150. The filename can be anything from a C-string, ``std::string``,
  151. ``std::wstring`` and ``boost::filesystem`` path. When using the path
  152. object the user needs to define the ADD_FS_PATH_SUPPORT compiler symbol to
  153. include the boost::filesystem dependency.
  154. Devices could be a ``FILE*``, ``std::ifstream``, and ``TIFF*`` for TIFF images.
  155. The second parameter is either an image or view type depending on the
  156. ``read_xxx`` function.
  157. The third and last parameter is either an instance of the
  158. ``image_read_settings<FormatTag>`` or just the ``FormatTag``.
  159. The settings can be various depending on the format which is being read.
  160. But the all share settings for reading a partial image area.
  161. The first point describes the top left image coordinate whereas the second
  162. are the dimensions in x and y directions.
  163. Here an example of setting up partial read::
  164. read_image( filename
  165. , img
  166. , image_read_settings< tiff_tag >( point_t( 0, 0 ), point_t( 50, 50 ) )
  167. );
  168. Each format supports reading just the header information,
  169. using ``read_image_info``. Please refer to the format specific sections
  170. under 3.3. A basic example follows::
  171. image_read_info< tiff_t > info = read_image_info( filename
  172. , tiff_t()
  173. );
  174. GIL also comes with a dynamic image extension.
  175. In the context of GIL.IO a user can define an ``any_image`` type based on
  176. several image types. The IO extension would then pick the matching image type
  177. to the current image file.
  178. The following example shows this feature::
  179. typedef mpl::vector< gray8_image_t
  180. , gray16_image_t
  181. , rgb8_image_t
  182. , rgba_image_t
  183. > my_img_types;
  184. any_image< my_img_types > runtime_image;
  185. read_image( filename
  186. , runtime_image
  187. , tiff_tag()
  188. );
  189. During the review it became clear that there is a need to read big images
  190. scanline by scanline. To support such use case a ``scanline_reader`` is
  191. implemented for all supported image formats.
  192. The ``scanline_read_iterators`` will then allow to traverse through the image.
  193. The following code sample shows the usage::
  194. typedef tiff_tag tag_t;
  195. typedef scanline_reader< typename get_read_device< const char*
  196. , tag_t
  197. >::type
  198. , tag_t
  199. > reader_t;
  200. reader_t reader = make_scanline_reader( "C:/boost/libs/gil/test/extension/io/images/tiff/test.tif", tag_t() );
  201. typedef rgba8_image_t image_t;
  202. image_t dst( reader._info._width, reader._info._height );
  203. fill_pixels( view(dst), image_t::value_type() );
  204. typedef reader_t::iterator_t iterator_t;
  205. iterator_t it = reader.begin();
  206. iterator_t end = reader.end();
  207. for( int row = 0; it != end; ++it, ++row )
  208. {
  209. copy_pixels( interleaved_view( reader._info._width
  210. , 1
  211. , ( image_t::view_t::x_iterator ) *it
  212. , reader._scanline_length
  213. )
  214. , subimage_view( view( dst )
  215. , 0
  216. , row
  217. , reader._info._width
  218. , 1
  219. )
  220. );
  221. }
  222. There are many ways to traverse an image but for as of now only by
  223. scanline is supported.
  224. Write Interface
  225. ~~~~~~~~~~~~~~~
  226. There is only one function for writing out images, write_view.
  227. Similar to reading the first parameter is either a filename or a device.
  228. The filename can be anything from a C-string, ``std::string``,
  229. ``std::wstring``, and ``boost::filesystem`` path. When using the path object
  230. the user needs to define the ``ADD_FS_PATH_SUPPORT`` compiler symbol to
  231. include the ``boost::filesystem`` dependency.
  232. Devices could be ``FILE*``, ``std::ifstream``, and ``TIFF*`` for TIFF images.
  233. The second parameter is an view object to image being written.
  234. The third and last parameter is either a tag or an
  235. ``image_write_info<FormatTag>`` object containing more settings.
  236. One example for instance is the JPEG quality.
  237. Refer to the format specific sections under 3.3. to have a list of all
  238. the possible settings.
  239. Writing an any_image<...> is supported. See the following example::
  240. typedef mpl::vector< gray8_image_t
  241. , gray16_image_t
  242. , rgb8_image_t
  243. , rgba_image_t
  244. > my_img_types;
  245. any_image< my_img_types > runtime_image;
  246. // fill any_image
  247. write_view( filename
  248. , view( runtime_image )
  249. , tiff_tag()
  250. );
  251. Compiler Symbols
  252. ~~~~~~~~~~~~~~~~
  253. The following table gives an overview of all supported compiler symbols
  254. that can be set by the user:
  255. .. comment [table Compiler Symbols
  256. ======================================================== ========================================================
  257. Symbol Description
  258. ======================================================== ========================================================
  259. BOOST_GIL_IO_ENABLE_GRAY_ALPHA Enable the color space "gray_alpha".
  260. BOOST_GIL_IO_ADD_FS_PATH_SUPPORT Enable boost::filesystem 3.0 library.
  261. BOOST_GIL_IO_PNG_FLOATING_POINT_SUPPORTED Use libpng in floating point mode. This symbol is incompatible with BOOST_GIL_IO_PNG_FIXED_POINT_SUPPORTED.
  262. BOOST_GIL_IO_PNG_FIXED_POINT_SUPPORTED Use libpng in integer mode. This symbol is incompatible with BOOST_GIL_IO_PNG_FLOATING_POINT_SUPPORTED.
  263. BOOST_GIL_IO_PNG_DITHERING_SUPPORTED Look up "dithering" in libpng manual for explanation.
  264. BOOST_GIL_IO_PNG_1_4_OR_LOWER Allow compiling with libpng 1.4 or lower.
  265. BOOST_GIL_EXTENSION_IO_JPEG_C_LIB_COMPILED_AS_CPLUSPLUS libjpeg is compiled as c++ lib.
  266. BOOST_GIL_EXTENSION_IO_PNG_C_LIB_COMPILED_AS_CPLUSPLUS libpng is compiled as c++ lib.
  267. BOOST_GIL_EXTENSION_IO_TIFF_C_LIB_COMPILED_AS_CPLUSPLUS libtiff is compiled as c++ lib.
  268. BOOST_GIL_EXTENSION_IO_ZLIB_C_LIB_COMPILED_AS_CPLUSPLUS zlib is compiled as c++ lib.
  269. BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES Allow basic test images to be read from local hard drive. The paths can be set in paths.hpp
  270. BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES Allow images to be written to the local hard drive. The paths can be set in paths.hpp
  271. BOOST_GIL_IO_USE_BMP_TEST_SUITE_IMAGES Run tests using the bmp test images suite. See _BMP_TEST_FILES
  272. BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES Run tests using the png test images suite. See _PNG_TEST_FILES
  273. BOOST_GIL_IO_USE_PNM_TEST_SUITE_IMAGES Run tests using the pnm test images suite. Send me an email for accessing the files.
  274. BOOST_GIL_IO_USE_TARGA_FILEFORMAT_TEST_SUITE_IMAGES Run tests using the targa file format test images suite. See _TARGA_TEST_FILES
  275. BOOST_GIL_IO_USE_TIFF_LIBTIFF_TEST_SUITE_IMAGES Run tests using the targa file format test images suite. See _TIFF_LIB_TIFF_TEST_FILES
  276. BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES Run tests using the targa file format test images suite. See _TIFF_GRAPHICSMAGICK_TEST_FILES
  277. ======================================================== ========================================================
  278. Supported Image Formats
  279. ~~~~~~~~~~~~~~~~~~~~~~~
  280. BMP
  281. +++
  282. For a general overview of the BMP image file format go to the
  283. following BMP_Wiki_.
  284. Please note, the code has not been tested on X Windows System variations
  285. of the BMP format which are usually referred to XBM and XPM formats.
  286. Here, only the MS Windows and OS/2 format is relevant.
  287. Currently the code is able to read and write the following image types:
  288. :Read: ``gray1_image_t``, ``gray4_image_t``, ``gray8_image_t``, ``rgb8_image_t`` and, ``rgba8_image_t``
  289. :Write: ``rgb8_image_t`` and, ``rgba8_image_t``
  290. The lack of having an indexed image type in gil restricts the current
  291. interface to only write out non-indexed images.
  292. This is subject to change soon.
  293. JPEG
  294. ++++
  295. For a general overview of the JPEG image file format go to the
  296. following JPEG_Wiki_.
  297. This jpeg extension is based on the libjpeg library which can be
  298. found here, JPEG_Lib_.
  299. All versions starting from 8x are supported.
  300. The user has to make sure this library is properly installed.
  301. I strongly recommend the user to build the library yourself.
  302. It could potentially save you a lot of trouble.
  303. Currently the code is able to read and write the following image types:
  304. :Read: ``gray8_image_t``, ``rgb8_image_t``, ``cmyk8_image_t``
  305. :Write: ``gray8_image_t``, ``rgb8_image_t``, ``cmyk8_image_t``
  306. Reading YCbCr or YCCK images is possible but might result in inaccuracies since
  307. both color spaces aren't available yet for gil.
  308. For now these color space are read as rgb images.
  309. This is subject to change soon.
  310. PNG
  311. +++
  312. For a general overview of the PNG image file format go to the
  313. following PNG_Wiki_.
  314. This png extension is based on the libpng, which can be found
  315. here, PNG_Lib_.
  316. All versions starting from 1.5.x are supported.
  317. The user has to make sure this library is properly installed.
  318. I strongly recommend the user to build the library yourself.
  319. It could potentially save you a lot of trouble.
  320. Currently the code is able to read and write the following image types:
  321. :Read: gray1, gray2, gray4, gray8, gray16, gray_alpha_8, gray_alpha_16, rgb8, rgb16, rgba8, rgba16
  322. :Write: gray1, gray2, gray4, gray8, gray16, gray_alpha_8, gray_alpha_16, rgb8, rgb16, rgba8, rgba16
  323. For reading gray_alpha images the user has to compile application with ``BOOST_GIL_IO_ENABLE_GRAY_ALPHA``
  324. macro defined. This color space is defined in the toolbox by using ``gray_alpha.hpp``.
  325. PNM
  326. +++
  327. For a general overview of the PNM image file format go to the
  328. following PNM_Wiki_. No external library is needed for the pnm format.
  329. The extension can read images in both flavours of the formats, ASCII and binary,
  330. that is types from P1 through P6; can write only binary formats.
  331. Currently the code is able to read and write the following image types:
  332. :Read: gray1, gray8, rgb8
  333. :Write: gray1, gray8, rgb8
  334. When reading a mono text image the data is read as a gray8 image.
  335. RAW
  336. +++
  337. For a general overview see RAW_Wiki_.
  338. Currently the extension is only able to read rgb8 images.
  339. TARGA
  340. +++++
  341. For a general overview of the BMP image file format go to the
  342. following TARGA_Wiki_.
  343. Currently the code is able to read and write the following image types:
  344. :Read: rgb8_image_t and rgba8_image_t
  345. :Write: rgb8_image_t and rgba8_image_t
  346. The lack of having an indexed image type in gil restricts the current
  347. interface to only write out non-indexed images.
  348. This is subject to change soon.
  349. TIFF
  350. ++++
  351. For a general overview of the TIFF image file format go to the
  352. following TIFF_Wiki_.
  353. This tiff extension is based on the libtiff, which can be found, TIFF_Lib_.
  354. All versions starting from 3.9.x are supported.
  355. The user has to make sure this library is properly installed. I strongly
  356. recommend the user to build the library yourself. It could potentially
  357. save you a lot of trouble.
  358. TIFF images can virtually encode all kinds of channel sizes representing
  359. various color spaces. Even planar images are possible.
  360. For instance, ``rbg323`` or ``gray7``. The channels also can have specific
  361. formats, like integer values or floating point values.
  362. For a complete set of options please consult the following websites:
  363. * TIFF_Base_Tags_
  364. * TIFF_Extension_Tags_
  365. The author of this extension is not claiming all tiff formats are supported.
  366. This extension is likely to be a moving target adding new features with each
  367. new milestone. Here is an incomplete lists:
  368. * Multi-page TIFF - read only
  369. * Strip TIFF - read and write support
  370. * Tiled TIFF - read and write support with user defined tiled sizes
  371. * Bit images TIFF - fully supported, like ``gray1_image_t`` (minisblack)
  372. * Planar TIFF - fully supported
  373. * Floating-point TIFF - fully supported
  374. * Palette TIFF - supported but no indexed image type is available as of now
  375. This gil extension uses two different test image suites to test read and
  376. write capabilities. See ``test_image`` folder.
  377. It's advisable to use ImageMagick test viewer to display images.
  378. Extending GIL::IO with new Formats
  379. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  380. Extending the gil::io with new formats is meant to be simple and
  381. straightforward. Before adding I would recommend to have a look at existing
  382. implementations and then trying to follow a couple of guidelines:
  383. * Create the following files for your new xxx format
  384. * ``xxx_read.hpp`` - Only includes read code
  385. * ``xxx_write.hpp`` - Only includes write code
  386. * ``xxx_all.hpp`` - includes xxx_read.hpp and xxx_write.hpp
  387. * Add the code to the ``boost::gil::detail`` namespace
  388. * Create a tag type for the new format. Like this::
  389. struct xxx_tag : format_tag {};
  390. * Create the image_read_info for the new format. It contains all the
  391. information that are necessary to read an image. It should be filled
  392. and returned by the ``get_info`` member of the reader class. See below::
  393. template<> struct image_read_info< xxx_tag > {};
  394. * Create the image_write_info for the new format. It contains all the
  395. information that are necessary to write an image::
  396. template<> struct image_write_info< xxx_tag > {};
  397. * Use the following reader skeleton as a start::
  398. template< typename Device
  399. , typename ConversionPolicy
  400. >
  401. class reader< Device
  402. , xxx_tag
  403. , ConversionPolicy
  404. >
  405. : public reader_base< xxx_tag
  406. , ConversionPolicy
  407. >
  408. {
  409. private:
  410. typedef typename ConversionPolicy::color_converter_type cc_t;
  411. public:
  412. reader( Device& device )
  413. : _io_dev( device )
  414. {}
  415. reader( Device& device
  416. , const cc_t& cc
  417. )
  418. : _io_dev( device )
  419. , reader_base< xxx_tag
  420. , ConversionPolicy
  421. >( cc )
  422. {}
  423. image_read_info< xxx_tag > get_info()
  424. {
  425. // your implementation here
  426. }
  427. template< typename View >
  428. void apply( const View& dst_view )
  429. {
  430. // your implementation here
  431. }
  432. };
  433. * The writer skeleton::
  434. template< typename Device >
  435. class writer< Device
  436. , xxx_tag
  437. >
  438. {
  439. public:
  440. writer( Device & file )
  441. : out(file)
  442. {}
  443. template<typename View>
  444. void apply( const View& view )
  445. {
  446. // your implementation here
  447. }
  448. template<typename View>
  449. void apply( const View& view
  450. , const image_write_info< xxx_tag >& info )
  451. {
  452. // your implementation here
  453. }
  454. };
  455. Running gil::io tests
  456. ---------------------
  457. gil::io comes with a large suite of test cases which reads and writes various
  458. file formats. It uses some test image suites which can be found online or
  459. which can be demanded from me by sending me an email.
  460. There are some test images created by me in the test folder.
  461. To enable unit tests which make use of them set the following compiler options
  462. ``BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES`` and
  463. ``BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES``.
  464. The following list provides all links to the image suites the compiler symbol
  465. to enable the tests:
  466. :BMP: BMP_TEST_FILES_ -- BOOST_GIL_IO_USE_BMP_TEST_SUITE_IMAGES
  467. :PNG: PNG_TEST_FILES_ -- BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES
  468. :PNM: request files from me -- BOOST_GIL_IO_USE_PNM_TEST_SUITE_IMAGES
  469. :TARGA: TARGA_TEST_FILES_ -- BOOST_GIL_IO_USE_TARGA_FILEFORMAT_TEST_SUITE_IMAGES
  470. :TIFF: TIFF_LIB_TIFF_TEST_FILES_ -- BOOST_GIL_IO_USE_TIFF_LIBTIFF_TEST_SUITE_IMAGES
  471. :TIFF: TIFF_GRAPHICSMAGICK_TEST_FILES_ -- BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
  472. .. _BMP_Wiki: http://en.wikipedia.org/wiki/BMP_file_format
  473. .. _JPEG_Wiki: http://en.wikipedia.org/wiki/JPEG
  474. .. _JPEG_lib: http://www.ijg.org/
  475. .. _PNG_Wiki: http://en.wikipedia.org/wiki/Portable_Network_Graphics
  476. .. _PNG_Lib: http://libpng.org/pub/png/libpng.html
  477. .. _PNM_Wiki: http://en.wikipedia.org/wiki/Portable_anymap
  478. .. _RAW_Wiki: http://en.wikipedia.org/wiki/Raw_image_format
  479. .. _TARGA_Wiki: http://en.wikipedia.org/wiki/Truevision_TGA
  480. .. _RAW_lib: http://www.libraw.org/
  481. .. _RAW_Wiki: http://en.wikipedia.org/wiki/Raw_image_format
  482. .. _TIFF_Wiki: http://en.wikipedia.org/wiki/Tagged_Image_File_Format
  483. .. _TIFF_Lib: http://www.remotesensing.org/libtiff/
  484. .. _TIFF_Base_Tags: http://www.awaresystems.be/imaging/tiff/tifftags/baseline.html
  485. .. _TIFF_Extension_Tags: http://www.awaresystems.be/imaging/tiff/tifftags/extension.html
  486. .. _BMP_TEST_FILES: http://entropymine.com/jason/bmpsuite/
  487. .. _PNG_TEST_FILES: http://www.schaik.com/pngsuite/pngsuite.html
  488. .. _TARGA_TEST_FILES: http://www.fileformat.info/format/tga/sample/index.htm
  489. .. _TIFF_LIB_TIFF_TEST_FILES: http://www.remotesensing.org/libtiff/images.html
  490. .. _TIFF_GRAPHICSMAGICK_TEST_FILES: ftp://ftp.graphicsmagick.org/pub/tiff-samples/tiff-sample-images-be.tar.gz