]>
Commit | Line | Data |
---|---|---|
8414a40c VZ |
1 | <!-- Creator : groff version 1.18.1 --> |
2 | <!-- CreationDate: Mon Mar 13 18:03:08 2006 --> | |
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, | |
27 | TIFFCIELabToXYZ, TIFFXYZToRGB − color conversion | |
28 | routines.</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> | |
44 | void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *</b><i>ycbcr</i><b>, | |
45 | uint32</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>, | |
51 | float *</b><i>refWhite</i><b>);<br> | |
52 | void TIFFCIELabToXYZ(TIFFCIELabToRGB *</b><i>cielab</i><b>, | |
53 | uint32</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>, | |
55 | float *</b><i>Z</i><b>);<br> | |
56 | void TIFFXYZToRGB(TIFFCIELabToRGB *</b><i>cielab</i><b>, | |
57 | float</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>, | |
59 | uint32 *</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 | |
71 | that format. There is usually a problem of application to | |
72 | handle the data properly and convert between different | |
73 | colorspaces for displaying and printing purposes. To | |
74 | simplify this task libtiff implements several color | |
75 | conversion routines itself. In particular, these routines | |
76 | used 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 | |
80 | freeing 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> | |
108 | int*</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> | |
119 | int32*</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> | |
130 | int32*</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 | |
161 | proportions of the red, green and blue in luminance, Y (see | |
162 | section 21 of the TIFF 6.0 specification, where the YCbCr | |
163 | images discussed). <i>TIFFTAG_YCBCRCOEFFICIENTS</i> holds | |
164 | that values in TIFF file. <i>refBlackWhite</i> is a float | |
165 | array of 6 values which specifies a pair of headroom and | |
166 | footroom image data values (codes) for each image component | |
167 | (see section 20 of the TIFF 6.0 specification where the | |
168 | colorinmetry fields discussed). | |
169 | <i>TIFFTAG_REFERENCEBLACKWHITE</i> is responsible for | |
170 | storing these values in TIFF file. Following code snippet | |
171 | should 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; | |
181 | uint16 hs, vs; | |
182 | ||
183 | /* Initialize structures */ | |
184 | ycbcr = (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), | |
197 | sizeof(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> | |
225 | TIFFError("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 | |
237 | state");</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> | |
253 | TIFFGetFieldDefaulted(tif, TIFFTAG_REFERENCEBLACKWHITE, | |
254 | &refBlackWhite);<br> | |
255 | if (TIFFYCbCrToRGBInit(ycbcr, luma, refBlackWhite) < | |
256 | 0)</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> | |
275 | uint32 r, g, b;<br> | |
276 | uint32 Y;<br> | |
277 | int32 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 | |
308 | L*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 | |
432 | to 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 | |
451 | to 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 | |
470 | to 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 | |
493 | as</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 | |
605 | following 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 | |
735 | white. The <i>TIFFTAG_WHITEPOINT</i> contains the | |
736 | chromaticity of the white point of the image from where the | |
737 | reference white can be calculated using following | |
738 | formulae:</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> | |
748 | refWhite_X = whitePoint_x / whitePoint_y * refWhite_Y<br> | |
749 | refWhite_Z = (1.0 - whitePoint_x - whitePoint_y) / | |
750 | whitePoint_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 | |
759 | first one we will convert <i>CIE L*a*b* 1976</i> to <i>CIE | |
760 | XYZ</i> using <b>TIFFCIELabToXYZ()</b> routine, and at the | |
761 | second step we will convert <i>CIE XYZ</i> to <i>RGB</i> | |
762 | using <b>TIFFXYZToRGB().</b> Look at the code sample | |
763 | below:</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; | |
773 | float refWhite[3]; | |
774 | ||
775 | /* Initialize structures */ | |
776 | img->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 | |
820 | state.");</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> | |
845 | refWhite[1] = 100.0F;<br> | |
846 | refWhite[0] = whitePoint[0] / whitePoint[1] * | |
847 | refWhite[1];<br> | |
848 | refWhite[2] = (1.0F - whitePoint[0] - | |
849 | whitePoint[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, | |
868 | refWhite) < 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 | |
891 | state.");</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> | |
925 | uint32 r, g, b;<br> | |
926 | uint32 L;<br> | |
927 | int32 a, b;<br> | |
928 | float 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.remotesensing.org/libtiff/</b></p> | |
971 | </td> | |
972 | </table> | |
973 | <hr> | |
974 | </body> | |
975 | </html> |