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

使用 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);

    }

}

  1. 在这两个面板中,选择 CMYK 并键入 CMYK 的任何有效数字。两个面板必须具有相同的值。

  2. 现在比较每个面板的 RGB 值。它们应该是相同的。

  3. 选择单个面板并将滑块重置为 0。

  4. 现在,在同一面板中重新输入 RGB 值。

  5. 将两个面板都切换到 CMYK。我看到的面板中的值是不同的。

请注意,当采用另一种方式(即首先选择RGB并重新输入CMYK值)时,所有工作都可能按预期进行。我是否在转换过程中遗漏了某些内容,或者这是一个错误?

我在Windows 10上运行Java 10,我的IDE是日食。

也张贴在 http://www.javaprogrammingforums.com/java-theory-questions/41836-possible-bug-jcolorchooser.html


吃鸡游戏
浏览 111回答 3
3回答

紫衣仙女

我在 使用的颜色模型内进行了一些调试,特别是 (包私有类)。JColorChooserColorModelCMYK计算大多很简单,除了所有值 0..255 都通过缩放 255.0f 转换为浮点数 0.0..1.0。这引入了最低有效位(IEEE754 浮点表示)的舍入误差。此处 C=254 转换为 ~R=1(请注意,两个数组是同一个对象,并且它是就地更新的,因此 CMYK 值在转换过程中丢失。在转换回整数值进行适当的半向上舍入以进行显示时,这应该不是任何问题。但是,深入研究自身,我发现此函数由将浮点数组转换为打包的32位RGB值的例程使用:ColorModelprivate static int to8bit(float value) {     return (int) (255.0f * value); }它被截断了!我不知道这是否是一个错误,但它肯定是一个可用性问题。

白衣非少年

从一种(离散)颜色模型到另一种(离散)颜色模型的转换永远不会是完美的。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种颜色永远无法“达到”。

犯罪嫌疑人X

我也在日食上使用Java 8和Windows,它给了我同样的结果,但这不是问题所在。它对您来说工作正常,但是将RGB转换为CMYK的工作方式与将CMYK转换为RGB的工作方式不同。您可以在线在此转换器中看到它:https://www.rapidtables.com/convert/color/rgb-to-cmyk.htmlCMYK 适用于青色、品红色和黄色百分比。另一方面,RGB 的值从 0 到 255 为红色、绿色和蓝色。在我通过的网络中,你放置了该转换的公式,并且不以相同的双向方式工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java