*nix Documentation Project
·  Home
 +   man pages
·  Linux HOWTOs
·  FreeBSD Tips
·  *niX Forums

  man pages->IRIX man pages -> ifl/IFL (3)              
Title
Content
Arch
Section
 

short(0)

Contents


IFL(3)		  Image	Format Library C++ Reference Manual		IFL(3)


NAME    [Toc]    [Back]

     IFL - overview of Image Format Library

SYNOPSIS    [Toc]    [Back]

     The Image Format Library (IFL) is a library for opening, reading, writing
     and creating image	files in a format independent manner. IFL consists of
     a library developed in C++. An interface library for C programmers	is
     also provided.  IFL includes support for the FIT, GIF, JFIF, Photo	CD,
     PNG, PPM, SGI, TIFF and numerous other file formats.  It also supports
     reading and writing raw image data	in a fairly flexible manner.  It is
     designed to be very easy to use with a straight-forward mechanism support
     user-defined file formats.


GETTING	STARTED
     To	open a file and	read it	into memory you	can write C++ code like	the
     following:

	  #include <ifl/iflFile.h>

	  // open the file named by 'filename'

	  iflStatus sts;
	  iflFile* file	= iflFile::open(filename, O_RDONLY, &sts);
	  if (sts != iflOKAY) {	/* handle the error */ }

	  // read the entire image (just the first plane in z if image has depth)
	  // into a buffer of unsiged chars

	  iflSize dims;
	  file->getDimensions(dims);
	  unsigned char* data =	new unsigned char[dims.x*dims.y*dims.c];
	  iflConfig cfg(iflUChar, iflInterleaved);
	  sts =	file->getTile(0, 0, 0, dims.x, dims.y, 1, data,	&cfg);
	  if (sts != iflOKAY) {	/* handle error	*/ }

	  // close the file
	  file->close();


     or	equivalently in	C you could write:

	  #include <ifl/iflCdefs.h>

	  /* open the file named by 'filename' */

	  iflStatus sts;
	  iflFile *file;
	  iflSize dims;
	  unsigned char	*data;
	  iflConfig* cfg;



									Page 1






IFL(3)		  Image	Format Library C++ Reference Manual		IFL(3)



	  file = iflFileOpen(filename, O_RDONLY, &sts);
	  if (sts != iflOKAY) {	/* handle the error */ }

	  /*
	      read the entire image (just the first plane in z if image
	      has depth) into a	buffer of unsiged chars
	  */

	  iflFileGetDimensions(file, &dims);
	  data = (unsigned char*)malloc(dims.x*dims.y*dims.c);
	  cfg =	iflConfigCreate(iflUChar, iflInterleaved, 0, NULL, 0, 0);
	  sts =	iflFileGetTile(file, 0,	0, 0, dims.x, dims.y, 1, data, cfg);
	  if (sts != iflOKAY) {	/* handle error	*/ }

	  /* close the file */
	  iflFileClose(file, 0);


     This simple example opens a file in any image format supported by IFL.
     The open function returns a pointer to an iflFile object which is IFL's
     abstraction for accessing image files. This object	is described further
     below and in the iflFile(3) man page. The file object is then used	to
     read the image's data it into memory. The iflConfig object	is used	to
     specify that that data should be read in the file's orientation, but with
     the pixels	forced to unsigned char	format and interleaved ordering.

     Creating and writing an image file	is just	as simple:

	  // create a one-channel, unsigned char image file
	  iflSize dims(width, height, 1);
	  iflFileConfig	fc(&dims, iflUChar);
	  iflStatus sts;
	  iflFile* file	= iflFile::create(filename, NULL, &fc, NULL, &sts);
	  if (sts != iflOKAY) {	/* handle the create error */ }

	  // write a tile of data to it
	  sts =	file->setTile(0, 0, 0, width, height, 1, data);
	  if (sts != iflOKAY) {	/* handle error	*/ }

	  // make sure the data	gets written out to disk (or you can close here)
	  sts =	file->flush();
	  if (sts != iflOKAY) {	/* handle error	*/ }


     or	equivalently in	C you could write:

	  iflFile *file;
	  iflFileConfig	*fc;
	  iflStatus sts;
	  iflSize dims;

	  /* create a one-channel, unsigned char image file */



									Page 2






IFL(3)		  Image	Format Library C++ Reference Manual		IFL(3)



	  dims.x = width;
	  dims.y = height;
	  dims.z = 1;
	  dims.c = 1;
	  fc = iflFileConfigCreate(&dims, iflUChar, 0, 0, 0, 0,	NULL);
	  file = iflFileCreate(filename, NULL, fc, NULL, &sts);
	  if (sts != iflOKAY) {	/* handle the create error */ }

	  /* write a tile of data to it	*/
	  sts =	iflFileSetTile(file, 0,	0, 0, width, height, 1,	data, NULL);
	  if (sts != iflOKAY) {	/* handle error	*/ }

	  /* make sure the data	gets written out to disk (or you can close here) */
	  sts =	iflFileFlush(file);
	  if (sts != iflOKAY) {	/* handle error	*/ }


     The code fragment above creates a one-channel file	with the specified
     width and height and unsigned char	data type.  The	rest of	the attributes
     default to	a format-preferred value.  The file format will	be inferred
     from the file name	suffix.	 (It is	also possible to explicitly give a
     format, and to inherit attributes from another iflFile.)  This example
     then writes a tile	of data	to the file.  It assumes the data buffer is
     the size and data type as the image created. It is	also possible to do
     automatic conversion on the setTile() operation.  Always be sure to flush
     or	close the file when you	are done writing data to it or the disk	file
     may not be	correctly written.

     Be	aware that IFL doesn't scale the data when converting data types, so
     you'd better be sure to pick a data type large enough to hold the range
     of	data values in the image file; you can use the getScaleMinMax()	and
     getStatMinMax() methods of	iflFile	to check the range of values.  Also,
     IFL doesn't do any	color model conversions; if you	need that level	of
     functionality you may want	to use the ImageVision Library (IL) that is
     layered on	top of IFL.

     The following section on image attributes defines some of the terms just
     used such as orientation and dimension ordering.


   Example source    [Toc]    [Back]
     If	you install ifl_dev.sw.gifts, you can examine the source code provided
     in	/usr/share/src/ifl/apps	for more examples of using IFL.

IMAGE ATTRIBUTES    [Toc]    [Back]

     The Image Format Library characterizes images according to	the common
     attributes	described in the following sections.







									Page 3






IFL(3)		  Image	Format Library C++ Reference Manual		IFL(3)



   Image size    [Toc]    [Back]
     Image have	four dimensions: x, y, z, and c.  The x	and y dimensions are
     typically the width and height of the image although their	interpretation
     is	dependent upon the orientation of the image (described below).

     The z dimension is	generally interpreted as either	depth for volume
     images or time for	image sequences	like movies; for 2D images the size of
     the z dimension is	one.

     The c dimension is	the channel or component dimension; the	size of	the c
     dimension is the number of	components in each pixel.  The size of the c
     dimension must match the color model (see below) of the image.  For
     example, an RGB image must	have a c size of three and a greyscale image
     must have a c size	of one.	 The only exception is the multi-spectral
     color model which can have	any size for the c dimension.  The image size
     is	represented by the iflSize structure defined in	<ifl/iflSize.h>.


   Data	type
     The data type of an IFL image is the data type of the individual
     components	of each	pixel.	All components of a pixel must have the	same
     data type.	 The library supports nine data	types: bit, signed byte,
     unsigned byte, signed short (16 bits), unsigned short, signed long	(32
     bits), unsigned long, float (32 bits) and double (64 bits).  These	data
     types are encoded by the iflDataType enum defined in <ifl/iflTypes.h>.
     Typically,	if a format actually stores data in say	4 bits per component
     the IFL interface to the file will	present	the data as unsigned char with
     a scaling range of	0-15 (see below).

     For a color palette image (see Color model	section	below),	the image's
     data type refers to the type of its color index.  The type	of the color
     map values	is determined by the file format and stored in an iflColormap.


   Dimension order    [Toc]    [Back]
     This is the relative ordering of the image's x, y and channel dimensions.
     There are three orderings supported by IFL:

	  interleaved	channel	dimension varies fastest, then x, then y, z
			last; thus all the components of each pixel are
			grouped	together

	  sequential	x dimension varies fastest, then channels, then	y, z
			last; all the components of a single row are grouped
			together (seldom used)

	  separate	x dimension varies fastest, then y, then channels, z
			last; the data is stored with each component isolated
			in a separate plane.






									Page 4






IFL(3)		  Image	Format Library C++ Reference Manual		IFL(3)



     These orderings are encoded by the	iflOrder enum defined in
     <ifl/iflTypes.h>.


   Color model    [Toc]    [Back]
     The color model of	an image defines the interpretation of the components
     of	its pixels.  There are 11 color	models supported by IFL: greyscale,
     inverted greyscale	(minimum is white, maximum is black), greyscale	plus
     alpha, color palette (indicies mapped through a color map), RGB triplets,
     RGB plus alpha, HSV, CMY, CMYK, YCC and multi-spectral.  There are	also
     component reversed	versions of RGB	and RGBA but their use is deprecated
     (they are for backward compatibility with older SGI systems).  These
     color models are encoded by the iflColorModel enum	defined	in
     <ifl/iflTypes.h>.


   Orientation    [Toc]    [Back]
     The orientation of	an image defines the spatial interpretation of its x
     and y dimensions.	It is defined in terms of the location of the origin
     of	the image (one of the four corners) and	the direction of the x and y
     dimension (whether	x runs horizontally or vertically).  The combination
     of	these two factors yields the eight orientations	supported by IFL:

	  upper-left	origin in upper-left corner, x dimension is horizontal
			(y is vertical)

	  upper-right	origin in upper-right corner, x	dimension is
			horizontal

	  lower-left	origin in lower-left corner, x dimension is horizontal

	  lower-right	origin in lower-right corner, x	dimension is
			horizontal

	  left-upper	origin in upper-left corner, x dimension is vertical
			(y is horizontal)

	  right-upper	origin in upper-right corner, x	dimension is vertical

	  right-lower	origin in lower-right corner, x	dimension is vertical

	  left-lower	origin in lower-left corner, x dimension is vertical

     These orientations	are encoded by the iflOrientation enum defined in
     <ifl/iflTypes.h>.


   Compression    [Toc]    [Back]
     The data in an image file may be compressed (depending on the format).
     Each format supported by IFL will automatically decompress	the data read
     from the file when	it is accessed through the iflFile methods getPage()
     and getTile().  Similarly,	each format will compress data passed to the



									Page 5






IFL(3)		  Image	Format Library C++ Reference Manual		IFL(3)



     setPage() and setTile() methods before it is written out.	The
     compressions are encoded in the iflCompression enum defined in
     <ifl/iflTypes.h>.


   Page	size
     Some images are stored in a paged manner, others are stored in horizontal
     strips, others may	not allow random access	at all.	 Each file format
     encodes the underlying structure of its data with the page	size
     attribute.	The page size defines the dimensions of	the natural chunks
     that an application can access with the getPage() and setPage() methods
     of	iflFile.  For arbitrarily paged	images the x and y page	size may be
     smaller than the image's x	and y size, requiring multiple fixed-size
     pages to be tiled across the image.  For strip oriented images the	page
     width will	be the same as the image width and the strips will be stacked
     vertically	to cover the image.  For images	that can't support random
     access to pages of	fixed size, the	page size will be the same as the
     image size; i.e. there will only be one page.

     The page size is defined by x, y, z and c dimensions as with the image
     size and follows the same rules with respect to the image's orientation.
     Data within each page is packed; there is no padding at the end of	each
     line, even	for bit	data.  Some file formats may indicate such padding by
     having the	page size wider	that the image size.


   Display scaling range    [Toc]    [Back]
     Some image	formats	store a	notion of the range of component values	for
     purposes of scaling the data for display.	This attribute may not be
     present in	an image, in which case	the application	should assume the
     range is the full range of	values than can	be represented by the image's
     component data type.  For images whose color model	is iflRGBpalette this
     is	the range of the entries on the	color map, not the indices.


   Statistical range    [Toc]    [Back]
     Some image	formats	store a	notion of the statistical range	of component
     values.  This range should	not be used for	display	scaling	purposes, but
     may be useful in some image processing computations.


   ICC profiles    [Toc]    [Back]
     Some image	formats	store an ICC (International Color Consortium) profile
     that can be used for color	management.  See http://www.color.org for more
     details on	the specifics of how such profiles are used.

THE IMAGE FILE ABSTRACTION    [Toc]    [Back]

     IFL's mechanism for accessing image files is through the iflFile class.
     This class	is used	as a base for deriving all of the file formats
     supported by IFL. It provides static methods to open existing image files
     and to create new ones.  It provides methods to read and write image



									Page 6






IFL(3)		  Image	Format Library C++ Reference Manual		IFL(3)



     data, query all attributes	and set	some attributes.  Format specific
     operations	are supported through the getItem() and	setItem() methods.
     Because of	this base abstraction, IFL enables applications	to be written
     that are image file format	independent, yet still allows full access to
     unique attributes and capabilities	of particular file formats.  Refer to
     the iflFile(3) man	page for more details.

THE IMAGE FORMAT ABSTRACTION    [Toc]    [Back]

     The Image Format Library uses the iflFormat object	to represent a
     description of the	capabilities of	a particular image file	format.	The
     iflFormat class provides a	number of functions that can be	used to	look
     up	formats	by format name,	by a file's "magic" number, or by file name
     extension (e.g. ".gif").  There is	also a method to iterate through all
     available formats ( useful	for user interfaces, for instance, to generate
     a menu of available file formats).

     The methods on an iflFormat allow the user	to determine which values of
     the image attributes are supported	by that	format.	 There are also
     methods to	query the preferred values of those attributes.	 See the
     iflFormat(3) man page for more details.

ADDING NEW IMAGE FILE FORMATS    [Toc]    [Back]

     To	add support for	a new image file format, you create a Dynamic Shared
     Object (DSO) that implements the format and add an	entry in the IFL file
     format database for the format.

     The DSO implements	the file format	I/O itself and the IFL interface
     abstraction.  This	is often done by using an already existing file	format
     library and creating an IFL interface that	makes calls into that library
     (see the iflJFIFFile.c++ and iflTIFFFile.c++ examples in ifl_dev.sw.gifts
     as	examples of this).  The	IFL interface is implemented by	deriving
     classes from iflFormat and	iflFile	for the	format.	 Refer to the
     iflFile(3)	and iflFormat(3) man pages for information on deriving your
     own classes.

     IFL uses a	text database file to determine	what file formats are
     available for use with IFL.  The database is normally located in the file
     /usr/lib/ifl/ifl_database but this	may be overridden with the
     IFL_DATABASE environment variable.


     The database is generated by the /usr/lib/ifl/ifldbgen program when new
     file formats are added to the system. To add you own file format, you
     should create a database file with	the new	entry or entries and place
     that file in the /usr/lib/ifl/database directory. Once there, running the
     ifldbgen program will generate the	updated	database. Unlike previous
     versions of IFL, you should not include an	include	directive in the new
     database file.  Doing so will result in conflicts when ifldbgen creates
     the new database.




									Page 7






IFL(3)		  Image	Format Library C++ Reference Manual		IFL(3)



   Building your DSO    [Toc]    [Back]
     There are two critical things that	must be	done when you build the	DSO
     for your file format.

	  You must build your DSO using	the C++	compiler so that the
	  statically declared iflFormat	derived	object (see the	iflFormat(3)
	  man page for more info) will be automatically	instantiated when the
	  DSO is dynamically opened by IFL.

	  The DSO version string must be 'sgi2.0' for IFL 1.1 and IFL 1.2 to
	  recognize it as a valid file format DSO.

     An	example	command	line to	create a DSO for the TIFF format might be:

	  % CC -mips3 -n32 -o libiflTIFF.so -set_version sgi2.0	-shared	-all \
	       iflTIFFFile.o -ltiff -lifl -lm

     The DSO would then	normally be installed in /usr/lib32 or some other
     directory that can	be pointed to by the LD_LIBRARYN32_PATH	environment
     variable.	If you wish your file format to	be useable with	both -32 and
     -n32 executables then you will need to build the DSO for each object
     style and install them in the appropriate directories.  See the ld(1) and
     rld(1) man	pages for more details on DSO search paths.


   Format of the database file    [Toc]    [Back]
     IFL database files	are text files made up of a list of "format"
     declarations.  A format declaration looks like this:

	  format formatname
	    match	   matchrule
	    description	   "human-readable description of the format"
	    dso		   name	of DSO file
	    access	   supported access modes
	    subsystem	   inst	sub-system containing the DSO
	    suffixes	   comma-separated list	of file	name suffixes


     The format	declaration must come first and	declares the name of an	image
     file format.  A format name is a one-word string and can be any legal Clanguage
 variable name.  Each format declaration must have	a unique name.
     All attribute declarations	that follow a format declaration may appear in
     any order and apply to that format	until the next format declaration is
     encountered in the	database file.	The match, description,	and dso
     attribute declarations are	required for every format.

     The match declaration is a	logical	expression that	determines whether a
     particular	file is	of the declared	format.	 A match rule consists of a
     C-style logical expression	made up	of functions, comparison operators and
     parentheses.  The following C-language operators may be used in a MATCH
     expression:




									Page 8






IFL(3)		  Image	Format Library C++ Reference Manual		IFL(3)



	  &&  ||  ==  !=  <  >	<=  >= ( )

     The == operator works for string comparisons as well as for numerical
     expressions.

     Numbers in	a match	expression may be expressed in decimal,	octal, or
     hexadecimal notation.  Octal numbers are expressed	with a leading zero,
     such as 0732.  Hexadecimal	numbers	are expressed with a leading `0x' such
     as	0xf03c.	 Decimal number	are expressed normally,	but may	not have a
     leading zero.

     The following expression functions	are available:

     char(n)	     Returns the signed	byte located at	offset n in the	file;
		     range -128	to 127.

     long(n)	     Returns the signed	long integer located at	offset n in
		     the file; range -2^31 to 2^31-1.

     short(n)	     Returns the signed	short integer located at offset	n in
		     the file; range -32768 to 32767.

     string(n,l)     Returns the l character long string located at offset n
		     in	the file.

     uchar(n)	     Returns the unsigned byte located at offset n in the
		     file; range 0 to 255.

     ulong(n)	     Returns the unsigned long integer located at offset n in
		     the file; range 0 to 2^32-1.

     ushort(n)	     Returns the unsigned short	integer	located	at offset n in
		     the file; range 0 to 65535.

     Typical match declaration examples	are:

	 match 
 == 0xda01

     or

	 match long(0) == 0xffd8ffe0 &&	string(6,4) == "JFIF"


     The description declaration is a human-readable description of the	image
     format.  Typical description declaration examples are:

	 description "Kodak Photo CD image"

     or

	 description "TIFF image"




									Page 9






IFL(3)		  Image	Format Library C++ Reference Manual		IFL(3)



     Descriptions should be relatively short as	they are used as the labels
     for GUI components	in some	applications.

     The dso declaration specifies that	name of	the DSO	that contains the code
     to	read and/or write the format.  This name is typically specified
     without a directory path; instead,	the environment	variable,
     LD_LIBRARY_PATH, is used to locate	the DSO	at run-time.

     The optional access declaration determines	what access modes are
     supported for the format.	Possible values	are: "readonly", "writeonly",
     or	the default, "readwrite".

     The optional subsystem declaration	can be used to name the	inst sub-
     system that should	be installed to	obtain support for the format.	This
     name is included in error messages	when the DSO for a format can not be
     opened.

     The optional suffixes declaration lists a set of file name	suffixes that
     will be used to determined	what format a newly created file should	use
     when the format is	not specified in an iflFile::create() call.  A typical
     suffixes rule would be:

	 suffixes .jpg,.jpeg


     Comments may be placed in a database file by using	the '!'	character.
     The comment extends to the	end of the line.

     Other files (like /usr/lib/ifl/ifl_database) can be included in a
     database file using the "#include"	directive.  This directive uses	the
     same syntax as the	C preprocessor equivalent; the "#" must	be the first
     character on a line and the filename must be enclosed in quotes or
     angle-brackets:

	 #include "filename"

     or

	 #include <filename>

     The filename must be an absolute pathname (i.e. it	must start with	a
     "/").

SEE ALSO    [Toc]    [Back]

      
      
     iflFile(3), iflFormat(3), iflSize(3), IFL(1), <ifl/iflTypes.h>, IL(1)


								       PPPPaaaaggggeeee 11110000
[ Back ]
 Similar pages
Name OS Title
IFL IRIX configuring the Image Format Library runtime environment
dmicsrc IRIX manipulate image converter context src image format
dmicdst IRIX manipulate image converter context dst image format
iflPCDO IRIX Kodak Photo CD Overview Pac file format
iflRaw IRIX raw image file format
iflXPM IRIX XPM format image file
iflGIF IRIX GIF format image file
iflSGI IRIX SGI format image file
iflXBM IRIX XBM format image file
iflYUV IRIX YUV format image file
Copyright © 2004-2005 DeniX Solutions SRL
newsletter delivery service