我有一个 32 位 (sRGB) 颜色空间的颜色,我想将其转换为具有位顺序 ABBBBBGGGGGRRRRR 的 16 位颜色空间。
我读到可以使用矩阵在空格之间进行转换,但我不确定它是如何工作的。
有人可以给我指出一个执行此操作的 java 示例吗?或者帮我做数学题吗?我们将不胜感激。
我的想法是将 32 位 RGB 值(rgb 0-255)转换为 CMY,然后将 CMY 转换回 RGB 16 位颜色空间(rgb 0-31)。
有没有办法做到这一点并进行必要的修正,以便我最终得到一个像样的图像?
最佳答案
无需往返 CMY。
只要稍微改变一下就能到达那里。
首先分割32位值。
它实际上是 24 位 RGB 加上 8 位 Alpha channel 。
然后我们移出最低有效位。
我们走吧。
char convert32Colorto16(Color color) {
byte a,r,g,b;
r = color.getRed() >> 3;
g = color.getGreen() >> 3;
b = color.getBlue() >> 3;
a = color.getAlpha() >> 7;
return (a << 15) | (b << 10) | (g << 5) | (r);
}
请注意,此处的 char 兼作无符号短整型。
这是快速简便的路线。
如果您采用颜色调色板并使用 32768 个最常见的颜色(假设 1 位用于 alpha channel ),那么您将必须对那些不在查找表中的像素进行大量查找和邻近选择,但是你会得到一张更好看的照片。
获得更好质量的另一个选择是忘记 Alpha channel 并将 6 个像素分配给绿色 channel 。 (人眼对绿色最敏感)。
关于java - 将 32 位颜色空间转换为 16 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19204472/