Little CMS xyY->实验-> sRGB红色主色的RGB意外结果

时间:2019-03-03 16:39:04

标签: c colors color-management

我正在尝试使用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);
}

0 个答案:

没有答案