我的最终目标是将RGB转换为CIELAB,进行一些颜色平均,然后转换回来。所以我的假设是,如果由于运行时环境,只有一个颜色输入,即没有平均,那么转换输出应该与 RGB 输入完全相同,但事实并非如此。
CIELAB 色彩空间使用 CIEXYZ 色彩空间(JDK 的一部分(的中间变换。这种转换似乎是不可逆的或有损的?这是对的吗?还是我的假设或实施有问题?我应该使用另一种方法来处理这些颜色吗?
测试和输出如下。为什么 rgb 和 rgb2 的颜色不一样?
private static final ColorSpace CIEXYZ =ColorSpace.getInstance(ColorSpace.CS_CIEXYZ);
@Test
public void testCiexyz() {
float[] rgb = new float[] {0.15686275f, 0.2f, 0.20784314f};
LOGGER.debug("rbg: {}",rgb);
float[] xyz = CIEXYZ.fromRGB(rgb);
LOGGER.debug("xyz: {}",xyz);
float[] rgb2 = CIEXYZ.toRGB(xyz);
LOGGER.debug("rbg2: {}",rgb2);
}
输出
09:46:59.762 [main] DEBUG org.phomos.sampler.ColorTest - rbg: [0.15686275, 0.2, 0.20784314]
09:46:59.875 [main] DEBUG org.phomos.sampler.ColorTest - xyz: [0.02709961, 0.030670166, 0.0289917]
09:46:59.911 [main] DEBUG org.phomos.sampler.ColorTest - rbg2: [0.12155337, 0.1400473, 0.1430228]
我终于找到了下面的 Java 类...
https://imagej.nih.gov/ij/plugins/download/Color_Space_Converter.java
内部类 ColorSpaceConverter 具有颜色空间转换,这些转换在数学上都是可逆的。我砍掉了外部类,因为它是一些整体 gui 应用程序的一部分,我不需要。
我学到了一些关于CIEXYZ和CIELAB色彩空间的知识,但仍然没有解释为什么标准的JDK类不能正常工作。无论哪种方式,上面的代码都有效!