JColorChooser中的异常行为(或可能的错误)

WJS*_*WJS 7 java swing undefined-behavior jcolorchooser

使用JColorChooser时,输入的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);
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 在两个面板中,选择CMYK,然后输入CMYK的任何有效数字。两个面板必须具有相同的值。
  2. 现在比较每个面板的RGB值。它们应该是相同的。
  3. 选择一个面板并将滑块重置为0。
  4. 现在,将RGB值重新输入到同一面板中。
  5. 将两个面板都切换为CMYK。我看到的面板中的值是不同的。

请注意,当采用另一种方式(即首先选择RGB并重新输入CMYK值)时,所有操作均符合预期。我是否在转换过程中缺少期望的内容,或者这是一个错误?

我在Windows 10上运行Java 10,而我的IDE是Eclipse。

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

Axe*_*ehl 6

从一种(离散)颜色模型到另一种(离散)颜色模型的转换永远不可能完美。

CMYK 到 RGB 到 CMYK 在 JColorChooser 中永远无法完美工作的原因很简单,因为 JColorChooser 显示整数而不是浮点数。例如,在 CMYK 模型中选择 Yellow=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 种颜色。