在 iOS 中创建/比较实验室配置的颜色
Posted
技术标签:
【中文标题】在 iOS 中创建/比较实验室配置的颜色【英文标题】:Creating/comparing Lab-profiled colors in iOS 【发布时间】:2011-09-11 19:30:55 【问题描述】:对于我正在开发的应用程序,我正在尝试创建和比较(之间的距离)CIE Lab 配置颜色。
我知道ways of converting 从典型的RGB 到Lab 都有一些数学运算,但如果可能的话,我想以更优雅的方式做到这一点。
创建 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 空间首先比 Lab 更受限制!此外,在从 CGColor 到 UIColor 的转换过程中,我是否会丢失我的色彩空间? (图像中最大的色彩空间是LAB)
还有一点需要考虑的是,iDevice 屏幕能否正确显示 Lab 颜色(因为它们的像素使用 RGB)?
基本上我正在寻找在 Lab 空间内生成随机颜色的正确方法。
比较 CIE LAB 颜色
然后,一旦我有了这些 Lab 颜色,我如何获得三个值(L、a 和 b)来计算一种颜色和另一种颜色之间的距离?一旦我创建了一种颜色并将其封装在 UIColor 中,读取和比较 UIColor 的 CGComponents 是否会保持我正在寻找的准确性? (我之前在 RGB 空间中通过取欧几里得距离来完成此操作,这里应该是相同的概念,除了距离将考虑人类感知差异 ,这就是我正在努力做的事情。)
###如果您已经阅读到这里,我感谢您,并感谢您提供的任何意见或您可以分享的类似经验!###
【问题讨论】:
【参考方案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;
【讨论】:
以上是关于在 iOS 中创建/比较实验室配置的颜色的主要内容,如果未能解决你的问题,请参考以下文章
为啥在OpenStack镜像实验中创建数据库用户出现了错误,有没有大神指点一下,谢谢。