我有32位(sRGB)颜色空间的颜色,我想将其转换为16位颜色空间,其位序为ABBBBBGGGGGRRRRR。
我读过你可以使用矩阵在空格之间进行转换,但我不确定它是如何工作的。
有人可以指点我这样做的一个例子吗?或者帮我解决数学问题?非常感谢。
我的想法是将32位rgb值(rgb 0-255)转换为CMY,然后将CMY转换回rgb 16位色彩空间(rgb 0-31)。
有没有办法做到这一点,并进行必要的更正,以便我得到一个像样的图像?
答案 0 :(得分:4)
没有必要再去CMY再回来 只需一点点转移就可以到达那里。
首先拆分32位值 它实际上是RGB的24位和Alpha通道的8位。
然后我们移出最不重要的位。
让我们走吧。
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在此处兼作unsigned short。
这是快捷方便的途径 如果您使用颜色调色板并使用32768最常见的颜色(假设alpha通道为1位),那么您将不得不为查找表中不在的那些像素执行大量查找和接近选择,但是你会得到一个更好看的图片。
质量更好的另一个选择是忘记alpha通道并将6个像素投入绿色通道。 (人眼对绿色最敏感)。
答案 1 :(得分:0)
您是在转换自定义应用程序还是从一种标准格式转换为另一种标准格式?
您可以通过将32位通道中的值截断为16位等效值来“强制”执行转换。例如,如果32位红色通道中有8位,则可以通过取8位颜色的高5位将其从16位红色通道中的5位中删除。编码相对容易,但可能效果不佳。
如果16位可用于表示颜色调色板,那么您可以扫描原始图像中的颜色,创建颜色直方图,选择价值65k的最常见颜色,并使用它们。
有许多算法可以从一种颜色深度转换为另一种颜色深度。我的第一个建议是查看open source code for Gimp。 Posterize功能允许您将每个通道的颜色降低,这实际上就是您正在做的事情。这不是全部和全部的答案,但它可能是一个开始并给你一些指示的好地方。