在iOS中创建/比较Lab-profiled颜色

时间:2011-09-11 19:30:55

标签: ios colors uicolor cgcolor cgcolorspace

对于我正在处理的应用程序,我正在尝试创建和比较CIE Lab个异形颜色之间的距离。

我知道从典型的ways of convertingRGBLab有一些数学,但如果可能的话,我想以更优雅的方式做到这一点。

创建CIE LAB颜色

到目前为止,我已经尝试了以下内容...... (白色/黑色点和范围编号来自here

    const CGFloat *components = CGColorGetComponents([UIColor colorWithRed:.11 green:.33 blue:.55 alpha:1.0].CGColor);

    float  whitePoint[3] = {0.95, 1.0, 1.09};
    float  blackPoint[3] = {0.0,0.0,0.0};
    float  range[4] = {-127.0,127.0,-127.0,127.0};
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateLab(whitePoint, blackPoint, range);

    [self.someArray addObject:[UIColor colorWithCGColor:CGColorCreate(colorSpaceRef, components)]];

我不确定这是否是在这个空间中创建颜色的正确方法,尤其是因为UIColor使用的RGB空间首先比实验室更受限制!另外,在从CGColor到UIColor的转换中,我是否会在此过程中丢失色彩空间? (图像中最大的颜色空间是LAB

需要考虑的是,iDevice屏幕能否正确显示Lab颜色(因为它们的像素使用RGB)?

基本上我正在寻找这种在Lab空间内生成随机颜色的正确方法。

The largest color space is CIE Lab

比较CIE LAB颜色

然后,一旦我有这些Lab颜色,我怎样才能获得三个值( L a b )来计算一种颜色与另一种颜色的距离?一旦我创建了一个颜色并将其封装在UIColor中,读取和比较UIColor的CGComponents会保持我正在寻找的准确度吗? (我之前在RGB空间中通过欧几里德距离完成了这个,它应该是相同的概念,除了距离考虑人类感知差异 这是我正在努力做的事情。)

如果您已经阅读了这篇文章,我感谢您,感谢您提供的任何意见或您可以分享的类似经历!

1 个答案:

答案 0 :(得分:1)

首先,您的图片具有误导性。它将色域外的色彩显示为色域内的色彩,它针对不同的色度显示出不同的亮度,并且缺少嵌入的色彩轮廓。

其次,到目前为止iOS设备尚未经过颜色校准。它们用于许多不同的环境,因此校准不会有用。因此,您无法期望能够计算出用户可能感知的颜色。我将它们视为sRGB显示器。

第三,无论RGB原色如何,所有CIELAB颜色都无法转换为有效的RGB值。

如果您希望统一采样CIELAB空间以获得有效颜色,我建议生成L * a * b * - 坐标并丢弃无效值。

CGFloat r,g,b;
while(1) {
    CGFloat L = random_from_range(0., 100.);
    CGFloat a = random_from_range(-128., 128.);
    CGFloat b = random_from_range(-128., 128.);
    CIELAB_to_sRGB(L,a,b,&r,&g,&b);
    if ( 0.0 <= r && r <= 1.0 && 0.0 <= g && g <= 1.0 && 0.0 <= b && b <= 1.0 ) {
        break;
    }
}