代码之家  ›  专栏  ›  技术社区  ›  Viktor Ilienko

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

  •  0
  • Viktor Ilienko  · 技术社区  · 7 年前

    请帮助运行LittleCMS中的颜色转换:我确实找到了如何使用double,但我正在使用无符号字符进行堆叠。 我在一个无符号字符数组中有BGR颜色,类似这样:无符号 char scanline [3] = {147, 112 220} . 值可以是 0-255 . 据我所知,LittleCMS文件:对于这种类型,我必须使用 TYPE_BGR_8 (和 TYPE_CMYK_8 用于输出)。 但它并没有以正确的方式转换–只有当我使用 TYPE_BGR_DBL , TYPE_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 %f\n Mageta %f\n Yellow %f\n Black %f\n ", 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 回复  |  直到 7 年前
        1
  •  0
  •   Viktor Ilienko    7 年前

    答案是:

    1) 没有必要规范化。如果您使用的是BYTE(无符号字符)。在这种情况下,值在0到255之间。如果我们使用double(DBL),那么我们必须规范化值:

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