Quartz 2D:CGColorSpaceCreateLab:范围参数的用途?

时间:2009-10-05 23:38:05

标签: colors core-graphics quartz-graphics

在Quartz 2D中,CGColorSpaceCreateLab()函数采用range参数定义如下:

  

CGFloat范围[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);

color1color2代表相同的颜色吗?或者range参数是否以某种方式缩放组件,使这两种颜色不同? (如果是后者,range的值对应于标准CIELAB坐标缩放?

选项2:可能会剪切组件值

鉴于上面定义的两个空格,请说我创建了以下颜色:

CGFloat components[] = { 50, 50, 50, 1 };
CGColorRef color1 = CGColorCreate(space1, components);
CGColorRef color2 = CGColorCreate(space2, components);

现在color1color2表示相同的颜色吗?或range参数是否将color1的组件剪切为{50,10,10,1}? (如果是后者,重点是什么?对色域定义的粗略近似?确保值保持在与其他数据类型兼容的范围内?)

选项3:也许它在其他地方使用,例如使用感知渲染意图进行色域映射时

对预期的L * a * b *值的范围有所了解可能有助于色域映射,特别是在感知情况下,但同样,这似乎是一个粗略的近似,我不明白为什么它会特别有用。

选项4:还有别的吗?

1 个答案:

答案 0 :(得分:7)

我做了一些测试,看起来答案是:

range参数会缩放a *和b *组件值。

此外,的组件值似乎被剪裁到指定范围。

所以在下面的例子中:

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 components1[] = { 50, 10, 10, 1 };
CGColorRef color1 = CGColorCreate(space1, components1);

CGFloat components2[] = { 50, 100, 100, 1 };
CGColorRef color2 = CGColorCreate(space2, components2);

CGColorRef color3 = CGColorCreate(space1, components2);
  • color1color2代表相同的颜色。
  • color3似乎保留指定的组件值,即使它们超出了颜色空间指定的范围。

最后,看起来范围规格为{-127,127,-127,127}会产生一个颜色空间,其标准CIELAB标度为a *和b *轴。

如果有人有更权威的答案,请发帖!