Я пытаюсь использовать библиотеку 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);
}