【问题标题】:Convert 32 Bit Color Space to 16 bit将 32 位色彩空间转换为 16 位
【发布时间】:2013-10-12 19:46:55
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: java colors rgb


【解决方案1】:

无需去 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 兼作 unsigned short。

这是快速简便的路线。
如果您采用调色板并使用 32768 种最常见的颜色(假设 1 位用于 Alpha 通道),那么您将不得不对那些不在您的查找表中的像素进行大量查找和邻近选择,但是你会得到一个更好看的图片。

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

【讨论】:

  • 我不得不说 - 这令人印象深刻。不过还是太蓝了。我正在调查你所说的邻近选择。
  • 它似乎是蓝色的,因为您的查看代码中存在错误,导致 alpha 位被解释为蓝色。那,或者你在解码时弄错了位。不应该有那么大的颜色偏差。
  • 只是想让你和其他人知道你是绝对正确的。我在实例化后来传递给您提供的方法的颜色的地方有错误的顺序。非常感谢 - 你是专业人士。谢谢。
【解决方案2】:

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

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

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

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

【讨论】:

  • 截断到最高位适用于我生成的缩略图。质量保持良好。谢谢你的建议。
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2010-12-12
相关资源
最近更新 更多