我正在尝试将Lab颜色转换为RGB。作为此转换的示例,Photoshop将
L= 100, a = 0, b = 127
变成
R=255, G=252, B=0.
型
这种颜色是鲜黄色。
我写了下面的转换例程(C/Objective C)。但是,有些地方不对。代码将输出
XYZ = 100.000000 100.000000 4.862713
RGB = 163.908401 90.755638 -13.093634
这里的RGB结果和Photoshop的RGB之间的不匹配似乎是相当大的。负蓝色分量也是一个问题。
任何关于如何更正以下代码的想法将不胜感激?或者,任何其他算法/公式/伪代码转换实验室到RGB?谢谢。
代码:
/*
* See Wikipedia artice on Lab color space
*
* http://en.wikipedia.org/wiki/Lab_color_space
*
*/
CGFloat fInv (CGFloat t) {
CGFloat T0 = (CGFloat) 6.0f/29.0f;
if (t > T0) {
return t*t*t;
}
return 3.0 * T0 * T0 * (t - 4.0f/29.0f);
}
int test() {
//
// Bright yellow test
//
CGFloat Ls = 100.0f;
CGFloat as = 0.0f;
CGFloat bs = 127.0f;
//
// Reference white point (ad hoc)
//
CGFloat Xn = 100;
CGFloat Yn = 100;
CGFloat Zn = 100;
//
// Taken Wikipedia (see above)
//
CGFloat X = Xn * fInv(1/116.0f * (Ls + 16.0f) + 1/500.0f * as);
CGFloat Y = Yn * fInv(1/116.0f * (Ls + 16.0f));
CGFloat Z = Zn * fInv(1/116.0f * (Ls + 16.0f) - 1/200.0f * bs);
NSLog(@" XYZ = %f %f %f", X, Y, Z);
//
//
// XYZ to RGB transfomration using AppleRGB. Taken from
//
// http://brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
//
//
CGFloat r = 2.9515373 * X - 1.2894116 * Y - 0.4738445 * Z;
CGFloat g = -1.0851093 * X + 1.9908566 * Y + 0.0372026 * Z;
CGFloat b = 0.0854934 * X - 0.2694964 * Y + 1.0912975 * Z;
NSLog(@" RGB = %f %f %f", r, g, b);
}
3条答案
按热度按时间bmvo0sr51#
试着从这个网站实现公式。我刚刚实现了RGB-〉Lab(通过XYZ),它工作得很好。
C++代码:
eqzww0vc2#
试试看
khbbv19g3#
每台i-device在色彩方面略有不同,但我相信苹果推荐所有设备使用sRGB作为设备色彩空间。当然,iPad 3/4的显示屏与sRGB匹配。(参见this colour analysis)
这意味着,如果您需要精确的颜色,您应该使用sRGB ICC配置文件来帮助您转换Lab颜色值。您可以使用开源软件Little CMS来为您完成此转换。