我正在尝试使用Little CMS库(2.9版)将Lab值转换为RGB。
当使用sRGB的红色色度作为输入时(根据Wikipedia,xyY = 0.6400, 0.3300, 0.2126
)我期望255, 0, 0
作为RGB结果,但是下面的代码仅返回248, 14, 22
。
我缺少什么/做错了什么?
#include <lcms2.h>
int main()
{
cmsCIExyY red_xyY = { 0.6400, 0.3300, 0.2126 };
cmsCIEXYZ red_XYZ;
cmsxyY2XYZ(&red_XYZ, &red_xyY);
cmsCIELab red_Lab_D50;
cmsXYZ2Lab(cmsD50_XYZ(), &red_Lab_D50, &red_XYZ);
cmsHPROFILE profile_Lab_D50 = cmsCreateLab2Profile(cmsD50_xyY());
cmsHPROFILE profile_sRGB = cmsCreate_sRGBProfile();
cmsHTRANSFORM transform =
cmsCreateTransform(profile_Lab_D50, TYPE_Lab_DBL, profile_sRGB, TYPE_RGB_8, INTENT_ABSOLUTE_COLORIMETRIC, 0);
double red_Lab_D50_double[] = { red_Lab_D50.L, red_Lab_D50.a, red_Lab_D50.b };
unsigned char red_RGB[3];
cmsDoTransform(transform, red_Lab_D50_double, red_RGB, 3);
cmsDeleteTransform(transform);
cmsCloseProfile(profile_sRGB);
cmsCloseProfile(profile_Lab_D50);
}
所有4个可用的ICC意图都会导致相同的结果。
使用光源D65会产生251, 0, 7
。
#include <lcms2.h>
int main()
{
cmsCIExyY red_xyY = { 0.6400, 0.3300, 0.2126 };
cmsCIEXYZ red_XYZ;
cmsxyY2XYZ(&red_XYZ, &red_xyY);
cmsCIExyY D65_xyY;
cmsWhitePointFromTemp(&D65_xyY, 6504);
cmsCIEXYZ D65_XYZ;
cmsxyY2XYZ(&D65_XYZ, &D65_xyY);
cmsCIELab red_Lab_D65;
cmsXYZ2Lab(&D65_XYZ, &red_Lab_D65, &red_XYZ);
cmsHPROFILE profile_Lab_D65 = cmsCreateLab2Profile(&D65_xyY);
cmsHPROFILE profile_sRGB = cmsCreate_sRGBProfile();
cmsHTRANSFORM transform =
cmsCreateTransform(profile_Lab_D65, TYPE_Lab_DBL, profile_sRGB, TYPE_RGB_8, INTENT_ABSOLUTE_COLORIMETRIC, 0);
double red_Lab_D50_double[] = { red_Lab_D65.L, red_Lab_D65.a, red_Lab_D65.b };
unsigned char red_RGB[3];
cmsDoTransform(transform, red_Lab_D50_double, red_RGB, 3);
cmsDeleteTransform(transform);
cmsCloseProfile(profile_sRGB);
cmsCloseProfile(profile_Lab_D65);
}