3 回答
TA贡献1839条经验 获得超15个赞
我在 使用的颜色模型内进行了一些调试,特别是 (包私有类)。JColorChooser
ColorModelCMYK
计算大多很简单,除了所有值 0..255 都通过缩放 255.0f 转换为浮点数 0.0..1.0。这引入了最低有效位(IEEE754 浮点表示)的舍入误差。
此处 C=254 转换为 ~R=1(请注意,两个数组是同一个对象,并且它是就地更新的,因此 CMYK 值在转换过程中丢失。
在转换回整数值进行适当的半向上舍入以进行显示时,这应该不是任何问题。但是,深入研究自身,我发现此函数由将浮点数组转换为打包的32位RGB值的例程使用:ColorModel
private static int to8bit(float value) { return (int) (255.0f * value); }
它被截断了!我不知道这是否是一个错误,但它肯定是一个可用性问题。
TA贡献1155条经验 获得超0个赞
从一种(离散)颜色模型到另一种(离散)颜色模型的转换永远不会是完美的。
CMYK到RGB到CMYK在J彩色选择器中永远不会完美工作的原因仅仅是因为J选择器显示整数而不是浮动数字。例如,在 CMYK 模型中选择黄色 =255,然后返回到 RGB。您将看到这种黄色是从红色= 255和绿色 = 255混合的。现在回到CMYK,黄色下部为254,并检查RGB值 - 它仍然是红色= 255和绿色= 255!
现在,在 CMYK 中将黄色更改为 253,然后返回到 RGB。红色和绿色仍然是255,蓝色是附加值1。CMYK 黄色 = 254(以前的情况)的正确值可能是蓝色 = 0.4,但为了使使用更简单,JColorChooser 中仅显示整数,因此蓝色显示为 0。
由于这些整数颜色模型的“颜色灵敏度”不同,这个数字问题变得更加严重。虽然CMYK有4个维度(青色,品红色,黄色,关键),因此可以表示256 ^ 4 = 4294967296但不同的颜色RGB有3个维度,只能表示256 ^ 3 = 16777216种颜色。因此,在将CMYK转换为这种类型的RGB时,您总是会丢失相当多的信息。
换句话说,平均而言,CMYK 色彩空间中的 256 个点仅由 RGB 色彩空间中的 1 个点表示。当您将一种颜色从RGB转换回CMYK时,平均而言,CMYK空间中的255种颜色永远无法“达到”。
TA贡献2080条经验 获得超4个赞
我也在日食上使用Java 8和Windows,它给了我同样的结果,但这不是问题所在。它对您来说工作正常,但是将RGB转换为CMYK的工作方式与将CMYK转换为RGB的工作方式不同。您可以在线在此转换器中看到它:
https://www.rapidtables.com/convert/color/rgb-to-cmyk.html
CMYK 适用于青色、品红色和黄色百分比。另一方面,RGB 的值从 0 到 255 为红色、绿色和蓝色。在我通过的网络中,你放置了该转换的公式,并且不以相同的双向方式工作。
添加回答
举报