在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);
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:还有别的吗?
答案 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);
color1
和color2
代表相同的颜色。color3
似乎保留指定的组件值,即使它们超出了颜色空间指定的范围。最后,看起来范围规格为{-127,127,-127,127}会产生一个颜色空间,其标准CIELAB标度为a *和b *轴。
如果有人有更权威的答案,请发帖!