【发布时间】:2009-10-05 23:38:04
【问题描述】:
在 Quartz 2D 中,CGColorSpaceCreateLab() 函数采用 range 参数,定义如下:
CGFloat range[4]: 一个由 4 个数字组成的数组,用于指定颜色空间的 a* 和 b* 分量的有效值范围。 a* 分量代表从绿色到红色的值,b* 分量代表从蓝色到黄色的值。
问题是,这个参数究竟做了什么?
我能想到至少三种可能的情况。
选项 1:可能会缩放组件值
假设我有两个不同范围的色彩空间:
CGFloat range1[] = { -10, 10, -10, 10 };
CGFloat range2[] = { -100, 100, -100, 100 };
CGColorSpaceRef space1 = CGColorSpaceCreateLab(whitePoint, blackPoint, range1);
CGColorSpaceRef space2 = CGColorSpaceCreateLab(whitePoint, blackPoint, range2);
我在每个空间的指定范围内创建具有相同分量值的颜色:
CGFloat components[] = { 50, 10, 10, 1 };
CGColorRef color1 = CGColorCreate(space1, components);
CGColorRef color2 = CGColorCreate(space2, components);
color1 和 color2 代表相同的颜色吗?或者range 参数是否以某种方式缩放组件,使这两种不同的颜色? (如果是后者,range 的什么值对应标准的CIELAB 坐标缩放?
选项 2:可能会剪切组件值
鉴于上面定义的两个空格,假设我创建了以下颜色:
CGFloat components[] = { 50, 50, 50, 1 };
CGColorRef color1 = CGColorCreate(space1, components);
CGColorRef color2 = CGColorCreate(space2, components);
现在color1 和color2 代表相同的颜色吗?或者range 参数是否将color1 的组件剪辑为{ 50, 10, 10, 1 }? (如果是后者,那有什么意义?色域定义的极其粗略的近似?确保值保持在与另一种数据类型兼容的范围内?)
选项 3:可能在其他地方使用,例如在使用感知渲染意图进行色域映射时
对预期的 L*a*b* 值的范围有所了解可能有助于色域映射,尤其是在感知情况下,但同样,这似乎是一个粗略的近似值,我不明白为什么它会特别有用。
选项 4:其他?
【问题讨论】:
标签: colors core-graphics