使用 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);
}
}
- 在两个面板中,选择 CMYK 并输入任何有效的 CMYK 数字。两个面板必须具有相同的值。
- 现在比较每个面板的 RGB 值。它们应该相同。
- 选择一个面板并将 slider 重置为 0。
- 现在将 RGB 值重新输入到同一个面板中。
- 为两个面板切换到 CMYK。我看到的面板中的值不同。
请注意,如果采用另一种方式(即首先选择 RGB 并重新输入 CMYK 值),一切都会像预期的那样工作。我错过了什么吗 转换过程的预期是什么,或者这是一个错误?
我在 Windows 10 上运行 Java 10,我的 IDE 是 Eclipse。
也张贴在 http://www.javaprogrammingforums.com/java-theory-questions/41836-possible-bug-jcolorchooser.html
最佳答案
我在 JColorChooser
使用的颜色模型中进行了一些调试,特别是 ColorModelCMYK
(包私有(private)类)。
除了所有值 0..255 都通过缩放 255.0f 转换为 float 0.0..1.0 之外,计算大部分都很简单。这会在(IEEE754 浮点表示的)最低有效位中引入舍入误差。
这里 C=254 被转换为 ~R=1(请注意,两个数组是同一个对象,并且就地更新,因此 CMYK 值在转换中丢失。
在转换回用于显示的整数值时进行适当的半向上舍入,这应该不是任何问题。但是,深入研究 ColorModel
本身,我发现将 float 组转换为打包的 32 位 RGB 值的例程使用了此函数:
private static int to8bit(float value) {
return (int) (255.0f * value);
}
它被截断了!我不知道这是否是一个错误,但这肯定是一个可用性问题。
关于java - JColorChooser 中的异常行为(或可能的错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55601157/