1<!-- Creator : groff version 1.18.1 --> 2<!-- CreationDate: Sat Feb 24 18:37:16 2007 --> 3<html> 4<head> 5<meta name="generator" content="groff -Thtml, see www.gnu.org"> 6<meta name="Content-Style" content="text/css"> 7<title>COLOR</title> 8</head> 9<body> 10 11<h1 align=center>COLOR</h1> 12<a href="#NAME">NAME</a><br> 13<a href="#SYNOPSIS">SYNOPSIS</a><br> 14<a href="#DESCRIPTION">DESCRIPTION</a><br> 15<a href="#SEE ALSO">SEE ALSO</a><br> 16 17<hr> 18<a name="NAME"></a> 19<h2>NAME</h2> 20<!-- INDENTATION --> 21<table width="100%" border=0 rules="none" frame="void" 22 cols="2" cellspacing="0" cellpadding="0"> 23<tr valign="top" align="left"> 24<td width="8%"></td> 25<td width="91%"> 26<p>TIFFYCbCrToRGBInit, TIFFYCbCrtoRGB, TIFFCIELabToRGBInit, 27TIFFCIELabToXYZ, TIFFXYZToRGB − color conversion 28routines.</p> 29</td> 30</table> 31<a name="SYNOPSIS"></a> 32<h2>SYNOPSIS</h2> 33<!-- INDENTATION --> 34<table width="100%" border=0 rules="none" frame="void" 35 cols="2" cellspacing="0" cellpadding="0"> 36<tr valign="top" align="left"> 37<td width="8%"></td> 38<td width="91%"> 39<p><b>#include <tiffio.h></b></p> 40<!-- INDENTATION --> 41<p><b>int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB 42*</b><i>ycbcr</i><b>, float *</b><i>luma</i><b>, float 43*</b><i>refBlackWhite"</i><b>);"<br> 44void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *</b><i>ycbcr</i><b>, 45uint32</b> <i>Y</i><b>, int32</b> <i>Cb</i><b>, int32</b> 46<i>Cr</i><b>, uint32 *</b><i>R</i><b>, uint32 47*</b><i>G</i><b>, uint32 *</b><i>B</i> <b>);</b></p> 48<!-- INDENTATION --> 49<p><b>int TIFFCIELabToRGBInit(TIFFCIELabToRGB 50*</b><i>cielab</i><b>, TIFFDisplay *</b><i>display</i><b>, 51float *</b><i>refWhite</i><b>);<br> 52void TIFFCIELabToXYZ(TIFFCIELabToRGB *</b><i>cielab</i><b>, 53uint32</b> <i>L</i><b>, int32</b> <i>a</i><b>, int32</b> 54<i>b</i><b>, float *</b><i>X</i><b>, float *</b><i>Y</i><b>, 55float *</b><i>Z</i><b>);<br> 56void TIFFXYZToRGB(TIFFCIELabToRGB *</b><i>cielab</i><b>, 57float</b> <i>X</i><b>, float</b> <i>Y</i><b>, float</b> 58<i>Z"</i><b>,</b><i>uint32</i><b>*"</b><i>R</i><b>, 59uint32 *</b><i>G</i><b>, uint32 *</b><i>B</i><b>);</b></p> 60</td> 61</table> 62<a name="DESCRIPTION"></a> 63<h2>DESCRIPTION</h2> 64<!-- INDENTATION --> 65<table width="100%" border=0 rules="none" frame="void" 66 cols="2" cellspacing="0" cellpadding="0"> 67<tr valign="top" align="left"> 68<td width="8%"></td> 69<td width="91%"> 70<p>TIFF supports several color spaces for images stored in 71that format. There is usually a problem of application to 72handle the data properly and convert between different 73colorspaces for displaying and printing purposes. To 74simplify this task libtiff implements several color 75conversion routines itself. In particular, these routines 76used in <b>TIFFRGBAImage(3TIFF)</b> interface.</p> 77<!-- INDENTATION --> 78<p><b>TIFFYCbCrToRGBInit()</b> used to initialize 79<i>YCbCr</i> to <i>RGB</i> conversion state. Allocating and 80freeing of the <i>ycbcr</i> structure belongs to programmer. 81<i>TIFFYCbCrToRGB</i> defined in <b>tiffio.h</b> as</p> 82</td> 83</table> 84<!-- INDENTATION --> 85<table width="100%" border=0 rules="none" frame="void" 86 cols="2" cellspacing="0" cellpadding="0"> 87<tr valign="top" align="left"> 88<td width="17%"></td> 89<td width="82%"> 90<pre>typedef struct { /* YCbCr->RGB support */ 91 TIFFRGBValue* clamptab; /* range clamping table */ 92</pre> 93</td> 94</table> 95<!-- TABS --> 96 97<table width="100%" border=0 rules="none" frame="void" 98 cols="5" cellspacing="0" cellpadding="0"> 99<tr valign="top" align="left"> 100 101<p>int*</p> 102<td width="28%"></td> 103<td width="-3%"></td> 104<td width="12%"></td> 105<td width="6%"> 106 107<p>Cr_r_tab;<br> 108int*</p> 109</td> 110<td width="56%"> 111</td> 112<tr valign="top" align="left"> 113<td width="28%"></td> 114<td width="-3%"></td> 115<td width="12%"></td> 116<td width="6%"> 117 118<p>Cb_b_tab;<br> 119int32*</p> 120</td> 121<td width="56%"> 122</td> 123<tr valign="top" align="left"> 124<td width="28%"></td> 125<td width="-3%"></td> 126<td width="12%"></td> 127<td width="6%"> 128 129<p>Cr_g_tab;<br> 130int32*</p> 131</td> 132<td width="56%"> 133</td> 134<tr valign="top" align="left"> 135<td width="28%"></td> 136<td width="-3%"></td> 137<td width="12%"></td> 138<td width="6%"> 139 140<p>Cb_g_tab;</p> 141</td> 142<td width="56%"> 143</td> 144</table> 145<!-- INDENTATION --> 146<table width="100%" border=0 rules="none" frame="void" 147 cols="2" cellspacing="0" cellpadding="0"> 148<tr valign="top" align="left"> 149<td width="17%"></td> 150<td width="82%"> 151<p>int32* Y_tab;<br> 152} TIFFYCbCrToRGB;</p></td> 153</table> 154<!-- INDENTATION --> 155<table width="100%" border=0 rules="none" frame="void" 156 cols="2" cellspacing="0" cellpadding="0"> 157<tr valign="top" align="left"> 158<td width="8%"></td> 159<td width="91%"> 160<p><i>luma</i> is a float array of three values representing 161proportions of the red, green and blue in luminance, Y (see 162section 21 of the TIFF 6.0 specification, where the YCbCr 163images discussed). <i>TIFFTAG_YCBCRCOEFFICIENTS</i> holds 164that values in TIFF file. <i>refBlackWhite</i> is a float 165array of 6 values which specifies a pair of headroom and 166footroom image data values (codes) for each image component 167(see section 20 of the TIFF 6.0 specification where the 168colorinmetry fields discussed). 169<i>TIFFTAG_REFERENCEBLACKWHITE</i> is responsible for 170storing these values in TIFF file. Following code snippet 171should helps to understand the the technique:</p> 172</td> 173</table> 174<!-- INDENTATION --> 175<table width="100%" border=0 rules="none" frame="void" 176 cols="2" cellspacing="0" cellpadding="0"> 177<tr valign="top" align="left"> 178<td width="17%"></td> 179<td width="82%"> 180<pre>float *luma, *refBlackWhite; 181uint16 hs, vs; 182 183/* Initialize structures */ 184ycbcr = (TIFFYCbCrToRGB*) 185</pre> 186</td> 187</table> 188<!-- TABS --> 189 190<table width="100%" border=0 rules="none" frame="void" 191 cols="2" cellspacing="0" cellpadding="0"> 192<tr valign="top" align="left"> 193<td width="24%"></td> 194<td width="75%"> 195 196<p>_TIFFmalloc(TIFFroundup(sizeof(TIFFYCbCrToRGB), 197sizeof(long))</p> 198</td> 199<tr valign="top" align="left"> 200<td width="24%"></td> 201<td width="75%"> 202 203<p>+ 4*256*sizeof(TIFFRGBValue)</p> 204</td> 205<tr valign="top" align="left"> 206<td width="24%"></td> 207<td width="75%"> 208 209<p>+ 2*256*sizeof(int)</p> 210</td> 211<tr valign="top" align="left"> 212<td width="24%"></td> 213<td width="75%"> 214 215<p>+ 3*256*sizeof(int32));</p> 216</td> 217</table> 218<!-- INDENTATION --> 219<table width="100%" border=0 rules="none" frame="void" 220 cols="2" cellspacing="0" cellpadding="0"> 221<tr valign="top" align="left"> 222<td width="17%"></td> 223<td width="82%"> 224<p>if (ycbcr == NULL) {<br> 225TIFFError("YCbCr->RGB",</p></td> 226</table> 227<!-- TABS --> 228<table width="100%" border=0 rules="none" frame="void" 229 cols="4" cellspacing="0" cellpadding="0"> 230<tr valign="top" align="left"> 231<td width="24%"></td> 232<td width="6%"> 233</td> 234<td width="6%"> 235 236<p>"No space for YCbCr->RGB conversion 237state");</p> 238</td> 239<td width="62%"> 240</td> 241</table> 242<!-- INDENTATION --> 243<table width="100%" border=0 rules="none" frame="void" 244 cols="2" cellspacing="0" cellpadding="0"> 245<tr valign="top" align="left"> 246<td width="17%"></td> 247<td width="82%"> 248<p>exit(0);<br> 249}</p> 250<!-- INDENTATION --> 251<p>TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRCOEFFICIENTS, 252&luma);<br> 253TIFFGetFieldDefaulted(tif, TIFFTAG_REFERENCEBLACKWHITE, 254&refBlackWhite);<br> 255if (TIFFYCbCrToRGBInit(ycbcr, luma, refBlackWhite) < 2560)</p></td> 257</table> 258<!-- TABS --> 259<table width="100%" border=0 rules="none" frame="void" 260 cols="2" cellspacing="0" cellpadding="0"> 261<tr valign="top" align="left"> 262<td width="24%"></td> 263<td width="75%"> 264 265<p>exit(0);</p> 266</td> 267</table> 268<!-- INDENTATION --> 269<table width="100%" border=0 rules="none" frame="void" 270 cols="2" cellspacing="0" cellpadding="0"> 271<tr valign="top" align="left"> 272<td width="17%"></td> 273<td width="82%"> 274<p>/* Start conversion */<br> 275uint32 r, g, b;<br> 276uint32 Y;<br> 277int32 Cb, Cr;</p> 278<!-- INDENTATION --> 279<p>for each pixel in image</p></td> 280</table> 281<!-- TABS --> 282<table width="100%" border=0 rules="none" frame="void" 283 cols="2" cellspacing="0" cellpadding="0"> 284<tr valign="top" align="left"> 285<td width="24%"></td> 286<td width="75%"> 287 288<p>TIFFYCbCrtoRGB(img->ycbcr, Y, Cb, Cr, &r, &g, 289&b);</p> 290</td> 291</table> 292<!-- INDENTATION --> 293<table width="100%" border=0 rules="none" frame="void" 294 cols="2" cellspacing="0" cellpadding="0"> 295<tr valign="top" align="left"> 296<td width="17%"></td> 297<td width="82%"> 298<p>/* Free state structure */<br> 299_TIFFfree(ycbcr);</p></td> 300</table> 301<!-- INDENTATION --> 302<table width="100%" border=0 rules="none" frame="void" 303 cols="2" cellspacing="0" cellpadding="0"> 304<tr valign="top" align="left"> 305<td width="8%"></td> 306<td width="91%"> 307<p><b>TIFFCIELabToRGBInit()</b> initializes the <i>CIE 308L*a*b* 1976</i> to <i>RGB</i> conversion state. 309<b>TIFFCIELabToRGB</b> defined as</p> 310</td> 311</table> 312<!-- INDENTATION --> 313<table width="100%" border=0 rules="none" frame="void" 314 cols="2" cellspacing="0" cellpadding="0"> 315<tr valign="top" align="left"> 316<td width="17%"></td> 317<td width="82%"> 318<pre>#define CIELABTORGB_TABLE_RANGE 1500 319 320</pre> 321</td> 322</table> 323<!-- TABS --> 324 325<table width="100%" border=0 rules="none" frame="void" 326 cols="9" cellspacing="0" cellpadding="0"> 327<tr valign="top" align="left"> 328<td width="17%"></td> 329<td width="6%"> 330 331<p>typedef struct {</p> 332</td> 333<td width="6%"></td> 334<td width="6%"></td> 335<td width="6%"></td> 336<td width="6%"> 337</td> 338<td width="6%"> 339 340<p>/* CIE Lab 1976->RGB support */</p> 341</td> 342<td width="6%"></td> 343<td width="37%"> 344</td> 345<tr valign="top" align="left"> 346<td width="17%"></td> 347<td width="6%"> 348</td> 349<td width="6%"> 350 351<p>int</p> 352</td> 353<td width="6%"> 354 355<p>range;</p> 356</td> 357<td width="6%"></td> 358<td width="6%"> 359</td> 360<td width="6%"> 361 362<p>/* Size of conversion table */</p> 363</td> 364<td width="6%"></td> 365<td width="37%"> 366</td> 367<tr valign="top" align="left"> 368<td width="17%"></td> 369<td width="6%"> 370</td> 371<td width="6%"> 372 373<p>float</p> 374</td> 375<td width="6%"></td> 376<td width="6%"> 377 378<p>rstep, gstep, bstep;</p> 379</td> 380<td width="6%"></td> 381<td width="6%"></td> 382<td width="6%"></td> 383<td width="37%"> 384</td> 385<tr valign="top" align="left"> 386<td width="17%"></td> 387<td width="6%"> 388</td> 389<td width="6%"> 390 391<p>float</p> 392</td> 393<td width="6%"></td> 394<td width="6%"> 395 396<p>X0, Y0, Z0;</p> 397</td> 398<td width="6%"></td> 399<td width="6%"></td> 400<td width="6%"> 401 402<p>/* Reference white point */</p> 403</td> 404<td width="37%"> 405</td> 406<tr valign="top" align="left"> 407<td width="17%"></td> 408<td width="6%"></td> 409<td width="6%"> 410 411<p>TIFFDisplay display;</p> 412</td> 413<td width="6%"></td> 414<td width="6%"></td> 415<td width="6%"></td> 416<td width="6%"></td> 417<td width="6%"></td> 418<td width="37%"> 419</td> 420<tr valign="top" align="left"> 421<td width="17%"></td> 422<td width="6%"> 423</td> 424<td width="6%"> 425 426<p>float</p> 427</td> 428<td width="6%"></td> 429<td width="6%"> 430 431<p>Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr 432to r */</p> 433</td> 434<td width="6%"></td> 435<td width="6%"></td> 436<td width="6%"></td> 437<td width="37%"> 438</td> 439<tr valign="top" align="left"> 440<td width="17%"></td> 441<td width="6%"> 442</td> 443<td width="6%"> 444 445<p>float</p> 446</td> 447<td width="6%"></td> 448<td width="6%"> 449 450<p>Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg 451to g */</p> 452</td> 453<td width="6%"></td> 454<td width="6%"></td> 455<td width="6%"></td> 456<td width="37%"> 457</td> 458<tr valign="top" align="left"> 459<td width="17%"></td> 460<td width="6%"> 461</td> 462<td width="6%"> 463 464<p>float</p> 465</td> 466<td width="6%"></td> 467<td width="6%"> 468 469<p>Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb 470to b */</p> 471</td> 472<td width="6%"></td> 473<td width="6%"></td> 474<td width="6%"></td> 475<td width="37%"> 476</td> 477</table> 478<!-- INDENTATION --> 479<table width="100%" border=0 rules="none" frame="void" 480 cols="2" cellspacing="0" cellpadding="0"> 481<tr valign="top" align="left"> 482<td width="17%"></td> 483<td width="82%"> 484<p>} TIFFCIELabToRGB;</p></td> 485</table> 486<!-- INDENTATION --> 487<table width="100%" border=0 rules="none" frame="void" 488 cols="2" cellspacing="0" cellpadding="0"> 489<tr valign="top" align="left"> 490<td width="8%"></td> 491<td width="91%"> 492<p><i>display</i> is a display device description, declared 493as</p> 494</td> 495</table> 496<!-- INDENTATION --> 497<table width="100%" border=0 rules="none" frame="void" 498 cols="2" cellspacing="0" cellpadding="0"> 499<tr valign="top" align="left"> 500<td width="17%"></td> 501<td width="82%"> 502<pre>typedef struct { 503</pre> 504</td> 505</table> 506<!-- TABS --> 507 508<table width="100%" border=0 rules="none" frame="void" 509 cols="2" cellspacing="0" cellpadding="0"> 510<tr valign="top" align="left"> 511<td width="24%"></td> 512<td width="75%"> 513 514<p>float d_mat[3][3]; /* XYZ -> luminance matrix */</p> 515</td> 516<tr valign="top" align="left"> 517<td width="24%"></td> 518<td width="75%"> 519 520<p>float d_YCR; /* Light o/p for reference white */</p> 521</td> 522<tr valign="top" align="left"> 523<td width="24%"></td> 524<td width="75%"> 525 526<p>float d_YCG;</p> 527</td> 528<tr valign="top" align="left"> 529<td width="24%"></td> 530<td width="75%"> 531 532<p>float d_YCB;</p> 533</td> 534<tr valign="top" align="left"> 535<td width="24%"></td> 536<td width="75%"> 537 538<p>uint32 d_Vrwr; /* Pixel values for ref. white */</p> 539</td> 540<tr valign="top" align="left"> 541<td width="24%"></td> 542<td width="75%"> 543 544<p>uint32 d_Vrwg;</p> 545</td> 546<tr valign="top" align="left"> 547<td width="24%"></td> 548<td width="75%"> 549 550<p>uint32 d_Vrwb;</p> 551</td> 552<tr valign="top" align="left"> 553<td width="24%"></td> 554<td width="75%"> 555 556<p>float d_Y0R; /* Residual light for black pixel */</p> 557</td> 558<tr valign="top" align="left"> 559<td width="24%"></td> 560<td width="75%"> 561 562<p>float d_Y0G;</p> 563</td> 564<tr valign="top" align="left"> 565<td width="24%"></td> 566<td width="75%"> 567 568<p>float d_Y0B;</p> 569</td> 570<tr valign="top" align="left"> 571<td width="24%"></td> 572<td width="75%"> 573 574<p>float d_gammaR; /* Gamma values for the three guns 575*/</p> 576</td> 577<tr valign="top" align="left"> 578<td width="24%"></td> 579<td width="75%"> 580 581<p>float d_gammaG;</p> 582</td> 583<tr valign="top" align="left"> 584<td width="24%"></td> 585<td width="75%"> 586 587<p>float d_gammaB;</p> 588</td> 589</table> 590<!-- INDENTATION --> 591<table width="100%" border=0 rules="none" frame="void" 592 cols="2" cellspacing="0" cellpadding="0"> 593<tr valign="top" align="left"> 594<td width="17%"></td> 595<td width="82%"> 596<p>} TIFFDisplay;</p></td> 597</table> 598<!-- INDENTATION --> 599<table width="100%" border=0 rules="none" frame="void" 600 cols="2" cellspacing="0" cellpadding="0"> 601<tr valign="top" align="left"> 602<td width="8%"></td> 603<td width="91%"> 604<p>For example, the one can use sRGB device, which has the 605following parameters:</p> 606</td> 607</table> 608<!-- INDENTATION --> 609<table width="100%" border=0 rules="none" frame="void" 610 cols="2" cellspacing="0" cellpadding="0"> 611<tr valign="top" align="left"> 612<td width="17%"></td> 613<td width="82%"> 614<pre>TIFFDisplay display_sRGB = { 615</pre> 616</td> 617</table> 618<!-- TABS --> 619 620<table width="100%" border=0 rules="none" frame="void" 621 cols="5" cellspacing="0" cellpadding="0"> 622<tr valign="top" align="left"> 623<td width="24%"></td> 624<td width="0%"></td> 625<td width="6%"> 626 627<p>{ /* XYZ -> luminance matrix */</p> 628</td> 629<td width="6%"></td> 630<td width="62%"> 631</td> 632<tr valign="top" align="left"> 633<td width="24%"></td> 634<td width="0%"></td> 635<td width="6%"> 636</td> 637<td width="6%"> 638 639<p>{ 3.2410F, -1.5374F, -0.4986F },</p> 640</td> 641<td width="62%"> 642</td> 643<tr valign="top" align="left"> 644<td width="24%"></td> 645<td width="0%"></td> 646<td width="6%"> 647</td> 648<td width="6%"> 649 650<p>{ -0.9692F, 1.8760F, 0.0416F },</p> 651</td> 652<td width="62%"> 653</td> 654<tr valign="top" align="left"> 655<td width="24%"></td> 656<td width="0%"></td> 657<td width="6%"> 658</td> 659<td width="6%"> 660 661<p>{ 0.0556F, -0.2040F, 1.0570F }</p> 662</td> 663<td width="62%"> 664</td> 665<tr valign="top" align="left"> 666<td width="24%"></td> 667<td width="0%"></td> 668<td width="6%"> 669 670<p>},</p> 671</td> 672<td width="6%"> 673</td> 674<td width="62%"> 675</td> 676<tr valign="top" align="left"> 677<td width="24%"></td> 678<td width="0%"></td> 679<td width="6%"> 680 681<p>100.0F, 100.0F, 100.0F, /* Light o/p for reference white 682*/</p> 683</td> 684<td width="6%"></td> 685<td width="62%"> 686</td> 687<tr valign="top" align="left"> 688<td width="24%"></td> 689<td width="0%"></td> 690<td width="6%"> 691 692<p>255, 255, 255, /* Pixel values for ref. white */</p> 693</td> 694<td width="6%"></td> 695<td width="62%"> 696</td> 697<tr valign="top" align="left"> 698<td width="24%"></td> 699<td width="0%"></td> 700<td width="6%"> 701 702<p>1.0F, 1.0F, 1.0F, /* Residual light o/p for black pixel 703*/</p> 704</td> 705<td width="6%"></td> 706<td width="62%"> 707</td> 708<tr valign="top" align="left"> 709<td width="24%"></td> 710<td width="0%"></td> 711<td width="6%"> 712 713<p>2.4F, 2.4F, 2.4F, /* Gamma values for the three guns 714*/</p> 715</td> 716<td width="6%"></td> 717<td width="62%"> 718</td> 719</table> 720<!-- INDENTATION --> 721<table width="100%" border=0 rules="none" frame="void" 722 cols="2" cellspacing="0" cellpadding="0"> 723<tr valign="top" align="left"> 724<td width="17%"></td> 725<td width="82%"> 726<p>};</p></td> 727</table> 728<!-- INDENTATION --> 729<table width="100%" border=0 rules="none" frame="void" 730 cols="2" cellspacing="0" cellpadding="0"> 731<tr valign="top" align="left"> 732<td width="8%"></td> 733<td width="91%"> 734<p><i>refWhite</i> is a color temperature of the reference 735white. The <i>TIFFTAG_WHITEPOINT</i> contains the 736chromaticity of the white point of the image from where the 737reference white can be calculated using following 738formulae:</p> 739</td> 740</table> 741<!-- INDENTATION --> 742<table width="100%" border=0 rules="none" frame="void" 743 cols="2" cellspacing="0" cellpadding="0"> 744<tr valign="top" align="left"> 745<td width="17%"></td> 746<td width="82%"> 747<p>refWhite_Y = 100.0<br> 748refWhite_X = whitePoint_x / whitePoint_y * refWhite_Y<br> 749refWhite_Z = (1.0 - whitePoint_x - whitePoint_y) / 750whitePoint_y * refWhite_X</p></td> 751</table> 752<!-- INDENTATION --> 753<table width="100%" border=0 rules="none" frame="void" 754 cols="2" cellspacing="0" cellpadding="0"> 755<tr valign="top" align="left"> 756<td width="8%"></td> 757<td width="91%"> 758<p>The conversion itself performed in two steps: at the 759first one we will convert <i>CIE L*a*b* 1976</i> to <i>CIE 760XYZ</i> using <b>TIFFCIELabToXYZ()</b> routine, and at the 761second step we will convert <i>CIE XYZ</i> to <i>RGB</i> 762using <b>TIFFXYZToRGB().</b> Look at the code sample 763below:</p> 764</td> 765</table> 766<!-- INDENTATION --> 767<table width="100%" border=0 rules="none" frame="void" 768 cols="2" cellspacing="0" cellpadding="0"> 769<tr valign="top" align="left"> 770<td width="17%"></td> 771<td width="82%"> 772<pre>float *whitePoint; 773float refWhite[3]; 774 775/* Initialize structures */ 776img->cielab = (TIFFCIELabToRGB *) 777</pre> 778</td> 779</table> 780<!-- TABS --> 781 782<table width="100%" border=0 rules="none" frame="void" 783 cols="2" cellspacing="0" cellpadding="0"> 784<tr valign="top" align="left"> 785<td width="24%"></td> 786<td width="75%"> 787 788<p>_TIFFmalloc(sizeof(TIFFCIELabToRGB));</p> 789</td> 790</table> 791<!-- INDENTATION --> 792<table width="100%" border=0 rules="none" frame="void" 793 cols="2" cellspacing="0" cellpadding="0"> 794<tr valign="top" align="left"> 795<td width="17%"></td> 796<td width="82%"> 797<p>if (!cielab) {</p></td> 798</table> 799<!-- TABS --> 800<table width="100%" border=0 rules="none" frame="void" 801 cols="5" cellspacing="0" cellpadding="0"> 802<tr valign="top" align="left"> 803<td width="24%"></td> 804<td width="0%"></td> 805<td width="6%"> 806 807<p>TIFFError("CIE L*a*b*->RGB",</p> 808</td> 809<td width="6%"></td> 810<td width="62%"> 811</td> 812<tr valign="top" align="left"> 813<td width="24%"></td> 814<td width="0%"></td> 815<td width="6%"> 816</td> 817<td width="6%"> 818 819<p>"No space for CIE L*a*b*->RGB conversion 820state.");</p> 821</td> 822<td width="62%"> 823</td> 824<tr valign="top" align="left"> 825<td width="24%"></td> 826<td width="0%"></td> 827<td width="6%"> 828 829<p>exit(0);</p> 830</td> 831<td width="6%"></td> 832<td width="62%"> 833</td> 834</table> 835<!-- INDENTATION --> 836<table width="100%" border=0 rules="none" frame="void" 837 cols="2" cellspacing="0" cellpadding="0"> 838<tr valign="top" align="left"> 839<td width="17%"></td> 840<td width="82%"> 841<p>}</p> 842<!-- INDENTATION --> 843<p>TIFFGetFieldDefaulted(tif, TIFFTAG_WHITEPOINT, 844&whitePoint);<br> 845refWhite[1] = 100.0F;<br> 846refWhite[0] = whitePoint[0] / whitePoint[1] * 847refWhite[1];<br> 848refWhite[2] = (1.0F - whitePoint[0] - 849whitePoint[1])</p></td> 850</table> 851<!-- TABS --> 852<table width="100%" border=0 rules="none" frame="void" 853 cols="2" cellspacing="0" cellpadding="0"> 854<tr valign="top" align="left"> 855<td width="24%"></td> 856<td width="75%"> 857 858<p>/ whitePoint[1] * refWhite[1];</p> 859</td> 860</table> 861<!-- INDENTATION --> 862<table width="100%" border=0 rules="none" frame="void" 863 cols="2" cellspacing="0" cellpadding="0"> 864<tr valign="top" align="left"> 865<td width="17%"></td> 866<td width="82%"> 867<p>if (TIFFCIELabToRGBInit(cielab, &display_sRGB, 868refWhite) < 0) {</p></td> 869</table> 870<!-- TABS --> 871<table width="100%" border=0 rules="none" frame="void" 872 cols="5" cellspacing="0" cellpadding="0"> 873<tr valign="top" align="left"> 874<td width="24%"></td> 875<td width="0%"></td> 876<td width="6%"> 877 878<p>TIFFError("CIE L*a*b*->RGB",</p> 879</td> 880<td width="6%"></td> 881<td width="62%"> 882</td> 883<tr valign="top" align="left"> 884<td width="24%"></td> 885<td width="0%"></td> 886<td width="6%"> 887</td> 888<td width="6%"> 889 890<p>"Failed to initialize CIE L*a*b*->RGB conversion 891state.");</p> 892</td> 893<td width="62%"> 894</td> 895<tr valign="top" align="left"> 896<td width="24%"></td> 897<td width="0%"></td> 898<td width="6%"> 899 900<p>_TIFFfree(cielab);</p> 901</td> 902<td width="6%"></td> 903<td width="62%"> 904</td> 905<tr valign="top" align="left"> 906<td width="24%"></td> 907<td width="0%"></td> 908<td width="6%"> 909 910<p>exit(0);</p> 911</td> 912<td width="6%"></td> 913<td width="62%"> 914</td> 915</table> 916<!-- INDENTATION --> 917<table width="100%" border=0 rules="none" frame="void" 918 cols="2" cellspacing="0" cellpadding="0"> 919<tr valign="top" align="left"> 920<td width="17%"></td> 921<td width="82%"> 922<p>}</p> 923<!-- INDENTATION --> 924<p>/* Now we can start to convert */<br> 925uint32 r, g, b;<br> 926uint32 L;<br> 927int32 a, b;<br> 928float X, Y, Z;</p> 929<!-- INDENTATION --> 930<p>for each pixel in image</p></td> 931</table> 932<!-- TABS --> 933<table width="100%" border=0 rules="none" frame="void" 934 cols="2" cellspacing="0" cellpadding="0"> 935<tr valign="top" align="left"> 936<td width="24%"></td> 937<td width="75%"> 938 939<p>TIFFCIELabToXYZ(cielab, L, a, b, &X, &Y, 940&Z);</p> 941</td> 942<tr valign="top" align="left"> 943<td width="24%"></td> 944<td width="75%"> 945 946<p>TIFFXYZToRGB(cielab, X, Y, Z, &r, &g, 947&b);</p> 948</td> 949</table> 950<!-- INDENTATION --> 951<table width="100%" border=0 rules="none" frame="void" 952 cols="2" cellspacing="0" cellpadding="0"> 953<tr valign="top" align="left"> 954<td width="17%"></td> 955<td width="82%"> 956<p>/* Don’t forget to free the state structure */<br> 957_TIFFfree(cielab);</p></td> 958</table> 959<a name="SEE ALSO"></a> 960<h2>SEE ALSO</h2> 961<!-- INDENTATION --> 962<table width="100%" border=0 rules="none" frame="void" 963 cols="2" cellspacing="0" cellpadding="0"> 964<tr valign="top" align="left"> 965<td width="8%"></td> 966<td width="91%"> 967<p><b>TIFFRGBAImage</b>(3TIFF) <b>libtiff</b>(3TIFF),</p> 968<!-- INDENTATION --> 969<p>Libtiff library home page: 970<b>http://www.simplesystems.org/libtiff/</b></p> 971</td> 972</table> 973<hr> 974</body> 975</html> 976