Blame html/man/TIFFcolor.3tiff.html

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

COLOR

Packit 7838c8
NAME
Packit 7838c8
SYNOPSIS
Packit 7838c8
DESCRIPTION
Packit 7838c8
SEE ALSO
Packit 7838c8
Packit 7838c8

Packit 7838c8
Packit 7838c8

NAME

Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

TIFFYCbCrToRGBInit, TIFFYCbCrtoRGB, TIFFCIELabToRGBInit,

Packit 7838c8
TIFFCIELabToXYZ, TIFFXYZToRGB − color conversion
Packit 7838c8
routines.

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

SYNOPSIS

Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

#include <tiffio.h>

Packit 7838c8
Packit 7838c8

int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB

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

Packit 7838c8
Packit 7838c8

int TIFFCIELabToRGBInit(TIFFCIELabToRGB

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

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

DESCRIPTION

Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

TIFF supports several color spaces for images stored in

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

Packit 7838c8
Packit 7838c8

TIFFYCbCrToRGBInit() used to initialize

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

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

int*

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

Cr_r_tab;

Packit 7838c8
int*

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

Cb_b_tab;

Packit 7838c8
int32*

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

Cr_g_tab;

Packit 7838c8
int32*

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

Cb_g_tab;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

int32* Y_tab;

Packit 7838c8
} TIFFYCbCrToRGB;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

luma is a float array of three values representing

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

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

_TIFFmalloc(TIFFroundup(sizeof(TIFFYCbCrToRGB),

Packit 7838c8
sizeof(long))

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

+ 4*256*sizeof(TIFFRGBValue)

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

+ 2*256*sizeof(int)

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

+ 3*256*sizeof(int32));

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

if (ycbcr == NULL) {

Packit 7838c8
TIFFError("YCbCr->RGB",

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="4" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

"No space for YCbCr->RGB conversion

Packit 7838c8
state");

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

exit(0);

Packit 7838c8
}

Packit 7838c8
Packit 7838c8

TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRCOEFFICIENTS,

Packit 7838c8
&luma);
Packit 7838c8
TIFFGetFieldDefaulted(tif, TIFFTAG_REFERENCEBLACKWHITE,
Packit 7838c8
&refBlackWhite);
Packit 7838c8
if (TIFFYCbCrToRGBInit(ycbcr, luma, refBlackWhite) <
Packit 7838c8
0)

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

exit(0);

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

/* Start conversion */

Packit 7838c8
uint32 r, g, b;
Packit 7838c8
uint32 Y;
Packit 7838c8
int32 Cb, Cr;

Packit 7838c8
Packit 7838c8

for each pixel in image

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
&b);

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

/* Free state structure */

Packit 7838c8
_TIFFfree(ycbcr);

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

TIFFCIELabToRGBInit() initializes the CIE

Packit 7838c8
L*a*b* 1976 to RGB conversion state.
Packit 7838c8
TIFFCIELabToRGB defined as

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
#define CIELABTORGB_TABLE_RANGE 1500
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="9" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

typedef struct {

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

/* CIE Lab 1976->RGB support */

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

int

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

range;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

/* Size of conversion table */

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

float

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

rstep, gstep, bstep;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

float

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

X0, Y0, Z0;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

/* Reference white point */

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

TIFFDisplay display;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

float

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
to r */

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

float

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
to g */

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

float

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
to b */

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

} TIFFCIELabToRGB;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

display is a display device description, declared

Packit 7838c8
as

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
typedef struct {
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

float d_YCG;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

float d_YCB;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

uint32 d_Vrwg;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

uint32 d_Vrwb;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

float d_Y0G;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

float d_Y0B;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

float d_gammaR; /* Gamma values for the three guns

Packit 7838c8
*/

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

float d_gammaG;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

float d_gammaB;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

} TIFFDisplay;

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
following parameters:

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
TIFFDisplay display_sRGB = {
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="5" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

{ /* XYZ -> luminance matrix */

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

{ 0.0556F, -0.2040F, 1.0570F }

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

},

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
*/

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
*/

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
*/

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

};

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

refWhite is a color temperature of the reference

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

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

refWhite_Y = 100.0

Packit 7838c8
refWhite_X = whitePoint_x / whitePoint_y * refWhite_Y
Packit 7838c8
refWhite_Z = (1.0 - whitePoint_x - whitePoint_y) /
Packit 7838c8
whitePoint_y * refWhite_X

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

The conversion itself performed in two steps: at the

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

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

_TIFFmalloc(sizeof(TIFFCIELabToRGB));

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

if (!cielab) {

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="5" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
state.");

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

exit(0);

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

}

Packit 7838c8
Packit 7838c8

TIFFGetFieldDefaulted(tif, TIFFTAG_WHITEPOINT,

Packit 7838c8
&whitePoint);
Packit 7838c8
refWhite[1] = 100.0F;
Packit 7838c8
refWhite[0] = whitePoint[0] / whitePoint[1] *
Packit 7838c8
refWhite[1];
Packit 7838c8
refWhite[2] = (1.0F - whitePoint[0] -
Packit 7838c8
whitePoint[1])

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

/ whitePoint[1] * refWhite[1];

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

if (TIFFCIELabToRGBInit(cielab, &display_sRGB,

Packit 7838c8
refWhite) < 0) {

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="5" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
state.");

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

_TIFFfree(cielab);

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

exit(0);

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

}

Packit 7838c8
Packit 7838c8

/* Now we can start to convert */

Packit 7838c8
uint32 r, g, b;
Packit 7838c8
uint32 L;
Packit 7838c8
int32 a, b;
Packit 7838c8
float X, Y, Z;

Packit 7838c8
Packit 7838c8

for each pixel in image

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
&Z);

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
&b);

Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

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

Packit 7838c8
_TIFFfree(cielab);

Packit 7838c8
Packit 7838c8
Packit 7838c8

SEE ALSO

Packit 7838c8
Packit 7838c8
Packit 7838c8
       cols="2" cellspacing="0" cellpadding="0">
Packit 7838c8
Packit 7838c8
Packit 7838c8
Packit 7838c8

TIFFRGBAImage(3TIFF) libtiff(3TIFF),

Packit 7838c8
Packit 7838c8

Libtiff library home page:

Packit 7838c8
http://www.simplesystems.org/libtiff/

Packit 7838c8
Packit 7838c8
Packit 7838c8

Packit 7838c8
</body>
Packit 7838c8
</html>