2

我在 32 位 (sRGB) 颜色空间中有一种颜色,我想将其转换为具有位顺序 ABBBBBGGGGGRRRRR 的 16 位颜色空间。

我读过您可以使用矩阵在空格之间进行转换,但我不确定它是如何工作的。

有人可以请我指向一个这样做的java示例吗?或者帮助我解决数学问题?这将不胜感激。

我的想法是将 32 位 rgb 值(rgb 0-255)转换为 CMY,然后将 CMY 转换回 rgb 16 位色彩空间(rgb 0-31)。

有没有办法做到这一点并进行必要的修正,所以我最终得到了一个像样的图像?

4

2 回答 2

4

没有必要去 CMY 再回来。
只需一点点移动就能让你到达那里。

首先拆分 32 位值。
它实际上是 24 位的 RGB 加上 8 位的 Alpha 通道。

然后我们移出最低有效位。

我们走吧。

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 通道),那么您将不得不对那些不在您的查找表中的像素进行大量查找和邻近选择,但是你会得到一个更好看的图片。

获得更好质量的另一个选择是忘记 Alpha 通道,将 6 个像素用于绿色通道。(人眼对绿色最敏感)。

于 2013-10-06T01:48:58.120 回答
0

您是为自定义应用程序转换还是从一种标准格式转换为另一种标准格式?

您可以通过将 32 位通道中的值截断为等效的 16 位来“蛮力”进行转换。例如,如果您在 32 位红色通道中有 8 位,则可以通过从 8 位颜色中取出高 5 位,将其在 16 位红色通道中减少为 5 位。这将相对容易编码,但可能不会给出好的结果。

如果 16 位可用于表示调色板,那么您可以扫描原始图像中的颜色,创建颜色直方图,选择 65k 最常见的颜色,然后使用它们。

有很多算法可以从一种颜色深度转换为另一种颜色深度。我的第一个建议是查看Gimp 的开源代码。分色功能允许您降低每个通道的颜色,这实际上就是您正在做的事情。这不是万能的答案,但它可能是一个很好的起点并为您提供一些指导。

于 2013-10-06T01:50:24.307 回答