java - 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);
}
}
- 在两个面板中,选择 CMYK 并输入 CMYK 的任何有效数字。两个面板必须具有相同的值。
- 现在比较每个面板的 RGB 值。他们应该是一样的。
- 选择一个面板并将滑块重置为 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
(包私有类)。
计算非常简单,除了所有值 0..255 通过缩放 255.0f 转换为浮点 0.0..1.0。这会在最低有效位(IEEE754 浮点表示)中引入舍入误差。
这里 C=254 被转换为 ~R=1 (请注意,两个数组都是同一个对象,并且它已就地更新,因此 CMYK 值在转换中丢失。
在转换回整数值进行显示时进行适当的半舍入,这应该不是任何问题。然而,深入ColorModel
研究自身,我发现这个函数被用于将浮点数组转换为压缩的 32 位 RGB 值的例程使用:
private static int to8bit(float value) {
return (int) (255.0f * value);
}
被截断了!我不知道这是否是一个错误,但它肯定是一个可用性问题。
推荐阅读
- javascript - html中以下格式的正则表达式
- regex - 如果后跟斜杠,则正则表达式不匹配
- scala - 如何从scala中的for循环返回产生的值?
- sql - 查找员工最多的国家/地区来自 SQL
- c++ - 递归模板类和专门的基本情况导致 MSVC 错误 C1001(在 GCC 和 Clang 上工作正常)
- extjs - 无限网格不再适用于 Ext JS 7.3.1 现代
- docker - 为什么构建 Docker 容器镜像的第一步需要一个基础镜像作为源,在我看来它本身就是一个像 ALPINE 这样的操作系统?
- javascript - 通过 YouTube API 更新默认广播的流标题
- kotlin - Kotlin 混合类型
- python - 如何在 ubuntu 中的 virtualbox 安装驱动器共享文件夹上创建 python3 virtualenv