c - LittleCMS库:在从rgb(bgr)到cmyk颜色的转换过程中,我必须使用哪种类型的变量



请帮助在 LittleCMS 中运行颜色转换:我确实找到了如何使用双精度,但我正在使用无符号字符堆叠。 我在一组无符号字符中确实有 BGR 颜色,如下所示:无符号char scanline [3] = {147, 112 220}。值可以0-255。据我了解 LittleCMS 的文档:对于这种类型,我必须使用 TYPE_BGR_8(和 TYPE_CMYK_8 用于输出(。但它没有以正确的方式转换——只有当我使用 TYPE_BGR_DBLTYPE_CMYK_DBL 将无符号数组转换为双精度并将我的输入数组规范化为 0-1 的值时,我才收到了正确的转换。请帮助优化我的代码:

1( 我必须将值规范化为 0-1 吗?

2( 我必须在程序中使用哪些类型来排除从无符号数组到双精度数组的转换?

我的程序和输出

1(以正确的方式工作:

#include <stdio.h>
#include <stdlib.h>
#include "lcms2.h"
int main (){
    cmsHPROFILE hInProfile, hOutProfile; 
    cmsHTRANSFORM hTransform; 
    hInProfile = cmsCreate_sRGBProfile();
    hOutProfile = cmsOpenProfileFromFile("/home/ab/Documents/cmyk/colorProfiles/WebCoatedSWOP2006Grade5.icc", "r");
hTransform = cmsCreateTransform(hInProfile, TYPE_BGR_DBL, hOutProfile, TYPE_CMYK_DBL, INTENT_PERCEPTUAL, 0);
cmsCloseProfile(hInProfile);
cmsCloseProfile(hOutProfile);
                unsigned char scanline0[3] = {147, 112, 220};
                double scanline [3], outputline [4];
                for(int k=0;k<3;k++){
                    scanline [k] = (double)scanline0 [k]/255;
                }
                printf("Red = %f n",scanline  [2]);
                printf("Green = %f n", scanline [1]);
                printf("Blue = %f n n", scanline [0]);
                cmsDoTransform(hTransform, scanline, outputline, 1); //transforming from one to other
                printf(" Cyan %fn Mageta %fn Yellow %fn Black %fn ", outputline[0], outputline[1], outputline[2], outputline[3]); //C M Y K
    return 0;
}

输出:

Red = 0.862745 
Green = 0.439216 
Blue = 0.576471 
 Cyan 15.350576
 Mageta 68.361944
 Yellow 25.549707
 Black 1.419089

2(当我使用无符号字符时,它以错误的方式工作。程序:

hTransform = cmsCreateTransform(hInProfile, TYPE_BGR_8, hOutProfile, TYPE_CMYK_8, INTENT_PERCEPTUAL, 0);
...
                unsigned char scanline[3] = {147, 112, 220}, outputline [4];
                printf("Red = %d n",scanline  [2]);
                printf("Green = %d n", scanline [1]);
                printf("Blue = %d n n", scanline [0]);
                cmsDoTransform(hTransform, scanline, outputline, 1);

输出:

Red = 220 
Green = 112 
Blue = 147 
 Cyan 39
 Mageta 174
 Yellow 65
 Black 4

答案是:

1(没有必要规范化。如果您正在使用 BYTE(无符号字符(。在这种情况下,值的范围为 0 到 255。如果我们使用双精度 (DBL(,那么我们必须规范化值:

RGB (BGR( = 0...1, CMYK = 0.0 ...100.0.

2(我们可以使用两种变体。

最新更新