roentgen b75cab
roentgen b75cab
roentgen b75cab
<html>
roentgen b75cab
<head>
roentgen b75cab
<meta name="generator" content="groff -Thtml, see www.gnu.org">
roentgen b75cab
<meta name="Content-Style" content="text/css">
roentgen b75cab
<title>COLOR</title>
roentgen b75cab
</head>
roentgen b75cab
<body>
roentgen b75cab
roentgen b75cab

COLOR

roentgen b75cab
NAME
roentgen b75cab
SYNOPSIS
roentgen b75cab
DESCRIPTION
roentgen b75cab
SEE ALSO
roentgen b75cab
roentgen b75cab

roentgen b75cab
roentgen b75cab

NAME

roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

TIFFYCbCrToRGBInit, TIFFYCbCrtoRGB, TIFFCIELabToRGBInit,

roentgen b75cab
TIFFCIELabToXYZ, TIFFXYZToRGB − color conversion
roentgen b75cab
routines.

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

SYNOPSIS

roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

#include <tiffio.h>

roentgen b75cab
roentgen b75cab

int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB

roentgen b75cab
*ycbcr, float *luma, float
roentgen b75cab
*refBlackWhite");"
roentgen b75cab
void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr,
roentgen b75cab
uint32 Y, int32 Cb, int32
roentgen b75cab
Cr, uint32 *R, uint32
roentgen b75cab
*G, uint32 *B );

roentgen b75cab
roentgen b75cab

int TIFFCIELabToRGBInit(TIFFCIELabToRGB

roentgen b75cab
*cielab, TIFFDisplay *display,
roentgen b75cab
float *refWhite);
roentgen b75cab
void TIFFCIELabToXYZ(TIFFCIELabToRGB *cielab,
roentgen b75cab
uint32 L, int32 a, int32
roentgen b75cab
b, float *X, float *Y,
roentgen b75cab
float *Z);
roentgen b75cab
void TIFFXYZToRGB(TIFFCIELabToRGB *cielab,
roentgen b75cab
float X, float Y, float
roentgen b75cab
Z",uint32*"R,
roentgen b75cab
uint32 *G, uint32 *B);

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

DESCRIPTION

roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

TIFF supports several color spaces for images stored in

roentgen b75cab
that format. There is usually a problem of application to
roentgen b75cab
handle the data properly and convert between different
roentgen b75cab
colorspaces for displaying and printing purposes. To
roentgen b75cab
simplify this task libtiff implements several color
roentgen b75cab
conversion routines itself. In particular, these routines
roentgen b75cab
used in TIFFRGBAImage(3TIFF) interface.

roentgen b75cab
roentgen b75cab

TIFFYCbCrToRGBInit() used to initialize

roentgen b75cab
YCbCr to RGB conversion state. Allocating and
roentgen b75cab
freeing of the ycbcr structure belongs to programmer.
roentgen b75cab
TIFFYCbCrToRGB defined in tiffio.h as

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
typedef struct {                /* YCbCr->RGB support */
roentgen b75cab
        TIFFRGBValue* clamptab; /* range clamping table */
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="5" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab

int*

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

Cr_r_tab;

roentgen b75cab
int*

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

Cb_b_tab;

roentgen b75cab
int32*

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

Cr_g_tab;

roentgen b75cab
int32*

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

Cb_g_tab;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

int32* Y_tab;

roentgen b75cab
} TIFFYCbCrToRGB;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

luma is a float array of three values representing

roentgen b75cab
proportions of the red, green and blue in luminance, Y (see
roentgen b75cab
section 21 of the TIFF 6.0 specification, where the YCbCr
roentgen b75cab
images discussed). TIFFTAG_YCBCRCOEFFICIENTS holds
roentgen b75cab
that values in TIFF file. refBlackWhite is a float
roentgen b75cab
array of 6 values which specifies a pair of headroom and
roentgen b75cab
footroom image data values (codes) for each image component
roentgen b75cab
(see section 20 of the TIFF 6.0 specification where the
roentgen b75cab
colorinmetry fields discussed).
roentgen b75cab
TIFFTAG_REFERENCEBLACKWHITE is responsible for
roentgen b75cab
storing these values in TIFF file. Following code snippet
roentgen b75cab
should helps to understand the the technique:

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
float *luma, *refBlackWhite;
roentgen b75cab
uint16 hs, vs;
roentgen b75cab
roentgen b75cab
/* Initialize structures */
roentgen b75cab
ycbcr = (TIFFYCbCrToRGB*)
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

_TIFFmalloc(TIFFroundup(sizeof(TIFFYCbCrToRGB),

roentgen b75cab
sizeof(long))

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

+ 4*256*sizeof(TIFFRGBValue)

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

+ 2*256*sizeof(int)

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

+ 3*256*sizeof(int32));

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

if (ycbcr == NULL) {

roentgen b75cab
TIFFError("YCbCr->RGB",

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="4" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

"No space for YCbCr->RGB conversion

roentgen b75cab
state");

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

exit(0);

roentgen b75cab
}

roentgen b75cab
roentgen b75cab

TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRCOEFFICIENTS,

roentgen b75cab
&luma);
roentgen b75cab
TIFFGetFieldDefaulted(tif, TIFFTAG_REFERENCEBLACKWHITE,
roentgen b75cab
&refBlackWhite);
roentgen b75cab
if (TIFFYCbCrToRGBInit(ycbcr, luma, refBlackWhite) <
roentgen b75cab
0)

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

exit(0);

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

/* Start conversion */

roentgen b75cab
uint32 r, g, b;
roentgen b75cab
uint32 Y;
roentgen b75cab
int32 Cb, Cr;

roentgen b75cab
roentgen b75cab

for each pixel in image

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

TIFFYCbCrtoRGB(img->ycbcr, Y, Cb, Cr, &r, &g,

roentgen b75cab
&b);

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

/* Free state structure */

roentgen b75cab
_TIFFfree(ycbcr);

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

TIFFCIELabToRGBInit() initializes the CIE

roentgen b75cab
L*a*b* 1976 to RGB conversion state.
roentgen b75cab
TIFFCIELabToRGB defined as

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
#define CIELABTORGB_TABLE_RANGE 1500
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="9" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

typedef struct {

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

/* CIE Lab 1976->RGB support */

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

int

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

range;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

/* Size of conversion table */

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

rstep, gstep, bstep;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

X0, Y0, Z0;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

/* Reference white point */

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

TIFFDisplay display;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr

roentgen b75cab
to r */

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg

roentgen b75cab
to g */

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb

roentgen b75cab
to b */

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

} TIFFCIELabToRGB;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

display is a display device description, declared

roentgen b75cab
as

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
typedef struct {
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float d_mat[3][3]; /* XYZ -> luminance matrix */

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float d_YCR; /* Light o/p for reference white */

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float d_YCG;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float d_YCB;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

uint32 d_Vrwr; /* Pixel values for ref. white */

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

uint32 d_Vrwg;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

uint32 d_Vrwb;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float d_Y0R; /* Residual light for black pixel */

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float d_Y0G;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float d_Y0B;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float d_gammaR; /* Gamma values for the three guns

roentgen b75cab
*/

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float d_gammaG;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

float d_gammaB;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

} TIFFDisplay;

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

For example, the one can use sRGB device, which has the

roentgen b75cab
following parameters:

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
TIFFDisplay display_sRGB = {
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="5" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

{ /* XYZ -> luminance matrix */

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

{ 3.2410F, -1.5374F, -0.4986F },

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

{ -0.9692F, 1.8760F, 0.0416F },

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

{ 0.0556F, -0.2040F, 1.0570F }

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

},

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

100.0F, 100.0F, 100.0F, /* Light o/p for reference white

roentgen b75cab
*/

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

255, 255, 255, /* Pixel values for ref. white */

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

1.0F, 1.0F, 1.0F, /* Residual light o/p for black pixel

roentgen b75cab
*/

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

2.4F, 2.4F, 2.4F, /* Gamma values for the three guns

roentgen b75cab
*/

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

};

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

refWhite is a color temperature of the reference

roentgen b75cab
white. The TIFFTAG_WHITEPOINT contains the
roentgen b75cab
chromaticity of the white point of the image from where the
roentgen b75cab
reference white can be calculated using following
roentgen b75cab
formulae:

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

refWhite_Y = 100.0

roentgen b75cab
refWhite_X = whitePoint_x / whitePoint_y * refWhite_Y
roentgen b75cab
refWhite_Z = (1.0 - whitePoint_x - whitePoint_y) /
roentgen b75cab
whitePoint_y * refWhite_X

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

The conversion itself performed in two steps: at the

roentgen b75cab
first one we will convert CIE L*a*b* 1976 to CIE
roentgen b75cab
XYZ using TIFFCIELabToXYZ() routine, and at the
roentgen b75cab
second step we will convert CIE XYZ to RGB
roentgen b75cab
using TIFFXYZToRGB(). Look at the code sample
roentgen b75cab
below:

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
float   *whitePoint;
roentgen b75cab
float   refWhite[3];
roentgen b75cab
roentgen b75cab
/* Initialize structures */
roentgen b75cab
img->cielab = (TIFFCIELabToRGB *)
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

_TIFFmalloc(sizeof(TIFFCIELabToRGB));

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

if (!cielab) {

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="5" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

TIFFError("CIE L*a*b*->RGB",

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

"No space for CIE L*a*b*->RGB conversion

roentgen b75cab
state.");

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

exit(0);

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

}

roentgen b75cab
roentgen b75cab

TIFFGetFieldDefaulted(tif, TIFFTAG_WHITEPOINT,

roentgen b75cab
&whitePoint);
roentgen b75cab
refWhite[1] = 100.0F;
roentgen b75cab
refWhite[0] = whitePoint[0] / whitePoint[1] *
roentgen b75cab
refWhite[1];
roentgen b75cab
refWhite[2] = (1.0F - whitePoint[0] -
roentgen b75cab
whitePoint[1])

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

/ whitePoint[1] * refWhite[1];

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

if (TIFFCIELabToRGBInit(cielab, &display_sRGB,

roentgen b75cab
refWhite) < 0) {

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="5" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

TIFFError("CIE L*a*b*->RGB",

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

"Failed to initialize CIE L*a*b*->RGB conversion

roentgen b75cab
state.");

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

_TIFFfree(cielab);

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

exit(0);

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

}

roentgen b75cab
roentgen b75cab

/* Now we can start to convert */

roentgen b75cab
uint32 r, g, b;
roentgen b75cab
uint32 L;
roentgen b75cab
int32 a, b;
roentgen b75cab
float X, Y, Z;

roentgen b75cab
roentgen b75cab

for each pixel in image

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

TIFFCIELabToXYZ(cielab, L, a, b, &X, &Y,

roentgen b75cab
&Z);

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

TIFFXYZToRGB(cielab, X, Y, Z, &r, &g,

roentgen b75cab
&b);

roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

/* Don’t forget to free the state structure */

roentgen b75cab
_TIFFfree(cielab);

roentgen b75cab
roentgen b75cab
roentgen b75cab

SEE ALSO

roentgen b75cab
roentgen b75cab
roentgen b75cab
       cols="2" cellspacing="0" cellpadding="0">
roentgen b75cab
roentgen b75cab
roentgen b75cab
roentgen b75cab

TIFFRGBAImage(3TIFF) libtiff(3TIFF),

roentgen b75cab
roentgen b75cab

Libtiff library home page:

roentgen b75cab
http://www.remotesensing.org/libtiff/

roentgen b75cab
roentgen b75cab
roentgen b75cab

roentgen b75cab
</body>
roentgen b75cab
</html>