Little CMS xyY -> Lab -> RGB неожиданный результат для sRGB red primary - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь использовать библиотеку Little CMS (версия 2.9) для преобразования значений Lab в RGB.

При использовании красной насыщенности sRGB в качестве входных данных (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);
}
...