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

标签 java swing undefined-behavior cmyk 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);
    }
}
  1. 在两个面板中,选择 CMYK 并输入任何有效的 CMYK 数字。两个面板必须具有相同的值。
  2. 现在比较每个面板的 RGB 值。它们应该相同。
  3. 选择一个面板并将 slider 重置为 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

最佳答案

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

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

这里 C=254 被转换为 ~R=1(请注意,两个数组是同一个对象,并且就地更新,因此 CMYK 值在转换中丢失。 rgb[0]*255f = 0.99999994

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

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

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

关于java - JColorChooser 中的异常行为(或可能的错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55601157/

相关文章:

java - 存储 jSessionId 和 userId 的最佳数据结构

java - 奇怪的错误转换为 dex 失败

java - 向 JList 添加滚动条?

c++ - 通过指向 unsigned long long 的指针访问 int 是否会导致 UB?

java - 如何从 Firebase 存储中检索图像 url 以进行 JSON 解析?

java - Android:以编程方式创建的VideoView显示黑屏

Java setBounds() 方法 (JFrame)

java - 将 Jtable 中的多行数据插入数据库

c - char[] + memcpy() 是否违反严格别名?

c - C 中的无符号 int 表现为负数