【问题标题】:Converting two bit color to eight bit color将两位颜色转换为八位颜色
【发布时间】:2011-08-23 22:49:44
【问题描述】:

我有六位颜色值,红色、绿色和蓝色各两位。所以黑色将表示为二进制000000、红色110000、蓝色000011、黄色111100等等。

我必须将此颜色转换为 24 位 rgb 值才能将其传递给图形层 (DirectFB)。由于三(二进制 11)要变成 255(0xFF),所以我使用下面的公式,以 85(=255/3)作为转换因子。

r = (color_6bit >> 4) * FACTOR;
g = ((color_6bit >> 2) & 0x3) * FACTOR;
b = (color_6bit & 0x3) * FACTOR;

color_32bit = (r << 16)| (g << 8) | b;

这会正确转换颜色(白色 [0x3F -> 0xFFFFFF]、红色 [0x30 -> 0xFF0000] 等)。

现在,这些颜色是要在电视上显示的字幕的文本颜色和背景颜色,我们有测试流,其中嵌入了参考调色板。当我将使用此公式获得的八位颜色绘制到屏幕上时,它与视频中存在的参考颜色并不完全匹配 - 它相当接近,但存在差异。

我是否正确地进行了转换,或者是否有任何标准算法可以将两位 rgb 颜色值转换为八位 rgb 值? DirectFB 是否可以在内部使用一些不同的表示形式(如 RGB565)?

不管怎样,当因子 85 替换为 48(通过反复试验找到的值)时,颜色几乎完美匹配。

【问题讨论】:

  • 你的意思是当因子85被84替换时也许?
  • @Paul 不,我的意思确实是四十八。
  • @Amarghosh:好的——这似乎与 85 相比有很大的不同——我想知道 FACTOR = 85 和 FACTOR = 48 的匹配如何“相当接近”和“几乎完美”?
  • @Paul - 我猜他的意思是视觉上的。显然,对于两个 0 位,您使用什么映射并不重要,因此颜色越深越接近匹配所使用的任何值。几乎任何单调的合理映射都会“相当接近”
  • @Nick:啊,好吧 - 这可能是有道理的 - 听起来 OP 需要做的第一件事就是开发一种更好的测试/验证结果的方法。

标签: c colors rgb directfb


【解决方案1】:

我知道的唯一标准是 EGA - wikipedia 上有一个参考。

对于它的价值,6 位是一个非常小的空间 - 只有 64 个值。在 cpu 时间和内存方面进行转换的最快方法几乎可以肯定只是在大小为 64 的数组中查找值。特别是如果您有测试数据,这真的很容易 - 只需将正确的 64 值从数组中的测试数据。这样您就不必担心它是否是一个标准 - 该标准正是适用于该系统的任何东西。

【讨论】:

  • 颜色位确实以RrGgBb 的形式出现;为了以防万一,我尝试了 rgbRGB 的 EGA 格式,它给了我完全不同的颜色,而不是我目前得到的近似匹配。
  • 好的,但我对数组的评论仍然成立。你觉得这有意义吗?
  • 是的,我明白了。我希望有一个标准算法(可能会考虑三个组件中的每一个来计算单个组件的 8 位值);查找表方法肯定会在性能方面有所帮助 - 感谢您的建议。
猜你喜欢
  • 2022-11-25
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 2015-05-19
  • 2015-11-24
相关资源
最近更新 更多