summaryrefslogtreecommitdiff
path: root/doc/functions/TIFFRGBAImage.rst
diff options
context:
space:
mode:
Diffstat (limited to 'doc/functions/TIFFRGBAImage.rst')
-rw-r--r--doc/functions/TIFFRGBAImage.rst235
1 files changed, 235 insertions, 0 deletions
diff --git a/doc/functions/TIFFRGBAImage.rst b/doc/functions/TIFFRGBAImage.rst
new file mode 100644
index 00000000..f61d314e
--- /dev/null
+++ b/doc/functions/TIFFRGBAImage.rst
@@ -0,0 +1,235 @@
+TIFFRGBAImage
+=============
+
+Synopsis
+--------
+
+.. highlight:: c
+
+::
+
+ #include <tiffio.h>
+
+.. c:type:: unsigned char TIFFRGBValue
+
+.. c:type:: struct _TIFFRGBAImage TIFFRGBAImage
+
+.. c:function:: int TIFFRGBAImageOK(TIFF* tif, char emsg[1024])
+
+.. c:function:: int TIFFRGBAImageBegin(TIFFRGBAImage* img, TIFF* tif, int stopOnError, char emsg[1024])
+
+.. c:function:: int TIFFRGBAImageGet(TIFFRGBAImage* img, uint32_t* raster, uint32_t width, uint32_t height)
+
+.. c:function:: void TIFFRGBAImageEnd(TIFFRGBAImage* img)
+
+Description
+-----------
+
+The routines described here provide a high-level interface through which
+TIFF images may be read into memory.
+Images may be strip- or tile-based and have a variety of different
+characteristics: bits/sample, samples/pixel, photometric, etc.
+Decoding state is encapsulated in a :c:type:`TIFFRGBAImage`
+structure making it possible to capture state for multiple images
+and quickly switch between them.
+The target raster format can be customized to a particular application's
+needs by installing custom routines that manipulate image data
+according to application requirements.
+
+The default usage for these routines is:
+
+* check if an image can be processed using :c:func:`TIFFRGBAImageOK`
+* construct a decoder state block using :c:func:`TIFFRGBAImageBegin`
+* read and decode an image into a target raster using :c:func:`TIFFRGBAImageGet`,
+ and then
+* release resources using :c:func:`TIFFRGBAImageEnd`
+
+:c:func:`TIFFRGBAImageGet` can be called multiple times to decode an
+image using different state parameters.
+If multiple images are to be displayed and there is not enough
+space for each of the decoded rasters, multiple state blocks can
+be managed and then calls can be made to :c:func:`TIFFRGBAImageGet`
+as needed to display an image.
+
+The generated raster is assumed to be an array of
+*width* × *height*
+32-bit entries, where *width* must be less than or equal to the width of
+the image (*height* may be any non-zero size).
+If the raster dimensions are smaller than the image, the image data
+is cropped to the raster bounds.
+If the raster height is greater than that of the image, then the
+image data are placed in the lower part of the raster.
+(Note that the raster is assume to be organized such that the pixel
+at location (*x*, *y*) is *raster* [ *y* × *width* + *x* ];
+with the raster origin in the *lower-left hand corner*.)
+
+Raster pixels are 8-bit packed red, green, blue, alpha samples.
+The macros :c:macro:`TIFFGetR`, :c:macro:`TIFFGetG`, :c:macro:`TIFFGetB`,
+and :c:macro:`TIFFGetA` should be used to access individual samples.
+Images without Associated Alpha matting information have a constant
+Alpha of 1.0 (255).
+
+:c:func:`TIFFRGBAImageGet` converts non-8-bit images by scaling sample
+values. Palette, grayscale, bilevel, CMYK, and YCbCr images are
+converted to RGB transparently.
+Raster pixels are returned uncorrected by any colorimetry information
+present in the directory.
+
+The parameter *stopOnError* specifies how to act if an error is
+encountered while reading the image. If *stopOnError* is non-zero,
+then an error will terminate the operation; otherwise
+:c:func:`TIFFRGBAImageGet` will continue processing data until all the
+possible data in the image have been requested.
+
+Alternate raster formats
+------------------------
+
+To use the core support for reading and processing TIFF images, but
+write the resulting raster data in a different format one need only
+override the "put methods" used to store raster data.
+These methods are are defined in the :c:type:`TIFFRGBAImage`
+structure and initially setup by :c:func:`TIFFRGBAImageBegin`
+to point to routines that pack raster data in the default
+ABGR pixel format.
+Two different routines are used according to the physical organization
+of the image data in the file:
+``PlanarConfiguration`` = 1 (packed samples), and
+``PlanarConfiguration`` = 2 (separated samples).
+Note that this mechanism can be used to transform the data before
+storing it in the raster.
+For example one can convert data to colormap indices for display on a
+colormap display.
+
+Simultaneous raster store and display
+-------------------------------------
+
+It is simple to display an image as it is being read into memory
+by overriding the put methods as described above for supporting
+alternate raster formats.
+Simply keep a reference to the default put methods setup by
+:c:func:`TIFFRGBAImageBegin` and then invoke them before or after
+each display operation. For example, the
+:doc:`/tools/tiffgt` utility uses the following put method to
+update the display as the raster is being filled:
+
+::
+
+ static void
+ putContigAndDraw(TIFFRGBAImage* img, uint32_t* raster,
+ uint32_t x, uint32_t y, uint32_t w, uint32_t h,
+ int32_t fromskew, int32_t toskew,
+ unsigned char* cp)
+ {
+ (*putContig)(img, raster, x, y, w, h, fromskew, toskew, cp);
+ if (x+w == width) {
+ w = width;
+ if (img->orientation == ORIENTATION_TOPLEFT)
+ lrectwrite(0, y-(h-1), w-1, y, raster-x-(h-1)*w);
+ else
+ lrectwrite(0, y, w-1, y+h-1, raster);
+ }
+ }
+
+(the original routine provided by the library is saved in the
+variable :c:var:`putContig`.)
+
+Supporting additional TIFF formats
+----------------------------------
+
+The :c:func:`TIFFRGBAImage` routines support the most commonly
+encountered flavors of TIFF. It is possible to extend this support by
+overriding the "get method" invoked by :c:func:`TIFFRGBAImageGet`
+to read TIFF image data.
+Details of doing this are a bit involved, it is best to make a copy
+of an existing get method and modify it to suit the needs of an
+application.
+
+Notes
+-----
+
+Samples must be either 1, 2, 4, 8, or 16 bits.
+Colorimetric samples/pixel must be either 1, 3, or 4 (i.e.
+``SamplesPerPixel`` -``ExtraSamples``).
+
+Palette image colormaps that appear to be incorrectly written
+as 8-bit values are automatically scaled to 16-bits.
+
+Return values
+-------------
+
+All routines return 1 if the operation was successful.
+Otherwise, 0 is returned if an error was encountered and
+*stopOnError* is zero.
+
+Diagnostics
+-----------
+
+All error messages are directed to the :c:func:`TIFFError` routine.
+
+``"Sorry, can not handle %d-bit pictures"``:
+
+ The image had ``BitsPerSample`` other than 1, 2, 4, 8, or 16.
+
+``"Sorry, can not handle %d-channel images"``:
+
+ The image had ``SamplesPerPixel`` other than 1, 3, or 4.
+
+``Missing needed "PhotometricInterpretation" tag``:
+
+ The image did not have a tag that describes how to display
+ the data.
+
+``No "PhotometricInterpretation" tag, assuming RGB``:
+
+ The image was missing a tag that describes how to display it,
+ but because it has 3 or 4 samples/pixel, it is assumed to be
+ RGB.
+
+``No "PhotometricInterpretation" tag, assuming min-is-black``:
+
+ The image was missing a tag that describes how to display it,
+ but because it has 1 sample/pixel, it is assumed to be a grayscale
+ or bilevel image.
+
+``"No space for photometric conversion table"``:
+
+ There was insufficient memory for a table used to convert
+ image samples to 8-bit RGB.
+
+``Missing required "Colormap" tag``:
+
+ A Palette image did not have a required ``Colormap`` tag.
+
+``"No space for tile buffer"``:
+
+ There was insufficient memory to allocate an i/o buffer.
+
+``"No space for strip buffer"``:
+
+ There was insufficient memory to allocate an i/o buffer.
+
+``"Can not handle format"``:
+
+ The image has a format (combination of ``BitsPerSample``,
+ ``SamplesPerPixel`` and ``PhotometricInterpretation``)
+ that can not be handled.
+
+``"No space for B&W mapping table"``:
+
+ There was insufficient memory to allocate a table used to map
+ grayscale data to RGB.
+
+``"No space for Palette mapping table"``:
+
+ There was insufficient memory to allocate a table used to map
+ data to 8-bit RGB.
+
+See also
+--------
+
+:doc:`TIFFOpen` (3tiff),
+:doc:`TIFFReadRGBAImage` (3tiff),
+:doc:`TIFFReadRGBAImageOriented` (3tiff),
+:doc:`TIFFReadRGBAStrip` (3tiff),
+:doc:`TIFFReadRGBATile` (3tiff),
+:doc:`libtiff` (3tiff)