在 Quartz 2D 中,CGColorSpaceCreateLab()
函数采用一个 range
参数,定义如下:
CGFloat range[4]: An array of 4 numbers that specify the range of valid values for the a* and b* components of the color space. The a* component represents values running from green to red, and the b* component represents values running from blue to yellow.
问题是,这个参数实际上做什么?
我至少可以想到三种可能的情况。
选项 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:还有其他内容吗?
最佳答案
我做了一些测试,看起来答案是:
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 } 的范围规范会产生 a* 和 b* 轴具有标准 CIELAB 比例的颜色空间。
如果谁有更权威的答案,请留言!
关于colors - quartz 2D : CGColorSpaceCreateLab: Purpose of range parameter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1522937/