LittleCMS 库:在从 rgb (bgr) 到 cmyk 颜色的转换过程中我必须使用哪种类型的变量
LittleCMS library: which type of variable do I have to use during conversion from rgb (bgr) to cmyk colors
请帮助 运行 在 LittleCMS 中转换颜色:我找到了如何使用 double,但我正在使用 unsigned char 进行堆叠。
我在一个无符号字符数组中确实有 BGR 颜色,像这样:无符号 char scanline [3] = {147, 112 220}
。值可以是 0-255
。
据我了解 LittleCMS 的文档:对于这种类型,我必须使用 TYPE_BGR_8
(并且 TYPE_CMYK_8
用于输出)。
但它没有以正确的方式转换——只有当我使用 TYPE_BGR_DBL
、TYPE_CMYK_DBL
,从无符号数组转换为 double 并将我的输入数组规范化为 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) 当我使用 unsigned char 时,它以错误的方式工作。
程序:
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) 我们可以同时使用这两种变体。
请帮助 运行 在 LittleCMS 中转换颜色:我找到了如何使用 double,但我正在使用 unsigned char 进行堆叠。
我在一个无符号字符数组中确实有 BGR 颜色,像这样:无符号 char scanline [3] = {147, 112 220}
。值可以是 0-255
。
据我了解 LittleCMS 的文档:对于这种类型,我必须使用 TYPE_BGR_8
(并且 TYPE_CMYK_8
用于输出)。
但它没有以正确的方式转换——只有当我使用 TYPE_BGR_DBL
、TYPE_CMYK_DBL
,从无符号数组转换为 double 并将我的输入数组规范化为 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) 当我使用 unsigned char 时,它以错误的方式工作。 程序:
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) 我们可以同时使用这两种变体。