为了账号安全,请及时绑定邮箱和手机立即绑定

JColor选择器中的异常行为(或可能的错误)

JColor选择器中的异常行为(或可能的错误)

吃鸡游戏 2022-09-28 15:56:59
使用 JColor 选择器时,输入的 CMYK 值将转换为特定的 RGB 颜色。在 RGB 端手动输入该颜色时,CMYK 值与以前不同。以下程序可用于演示我遇到的行为。import java.awt.*;import javax.swing.*;public class ColorChooserProblem {    JFrame f = new JFrame("Testing Color Chooser");    public static void main(String[] args) {        new ColorChooserProblem().start();    }    public void start() {        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        JColorChooser jc1 = new JColorChooser();        JColorChooser jc2 = new JColorChooser();        f.add(jc1, BorderLayout.NORTH);        f.add(jc2, BorderLayout.SOUTH);        f.pack();        f.setLocationRelativeTo(null);        f.setVisible(true);    }}在这两个面板中,选择 CMYK 并键入 CMYK 的任何有效数字。两个面板必须具有相同的值。现在比较每个面板的 RGB 值。它们应该是相同的。选择单个面板并将滑块重置为 0。现在,在同一面板中重新输入 RGB 值。将两个面板都切换到 CMYK。我看到的面板中的值是不同的。请注意,当采用另一种方式(即首先选择RGB并重新输入CMYK值)时,所有工作都可能按预期进行。我是否在转换过程中遗漏了某些内容,或者这是一个错误?我在Windows 10上运行Java 10,我的IDE是日食。也张贴在 http://www.javaprogrammingforums.com/java-theory-questions/41836-possible-bug-jcolorchooser.html
查看完整描述

3 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

我在 使用的颜色模型内进行了一些调试,特别是 (包私有类)。JColorChooserColorModelCMYK

计算大多很简单,除了所有值 0..255 都通过缩放 255.0f 转换为浮点数 0.0..1.0。这引入了最低有效位(IEEE754 浮点表示)的舍入误差。

此处 C=254 转换为 ~R=1(请注意,两个数组是同一个对象,并且它是就地更新的,因此 CMYK 值在转换过程中丢失。

//img1.sycdn.imooc.com//6333fe71000106b908090339.jpg

在转换回整数值进行适当的半向上舍入以进行显示时,这应该不是任何问题。但是,深入研究自身,我发现此函数由将浮点数组转换为打包的32位RGB值的例程使用:ColorModel

private static int to8bit(float value) { 
   return (int) (255.0f * value);
}

它被截断了!我不知道这是否是一个错误,但它肯定是一个可用性问题。


查看完整回答
反对 回复 2022-09-28
?
白衣非少年

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种颜色永远无法“达到”。


查看完整回答
反对 回复 2022-09-28
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

我也在日食上使用Java 8和Windows,它给了我同样的结果,但这不是问题所在。它对您来说工作正常,但是将RGB转换为CMYK的工作方式与将CMYK转换为RGB的工作方式不同。您可以在线在此转换器中看到它:

https://www.rapidtables.com/convert/color/rgb-to-cmyk.html

CMYK 适用于青色、品红色和黄色百分比。另一方面,RGB 的值从 0 到 255 为红色、绿色和蓝色。在我通过的网络中,你放置了该转换的公式,并且不以相同的双向方式工作。


查看完整回答
反对 回复 2022-09-28
  • 3 回答
  • 0 关注
  • 57 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信