【发布时间】: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 需要做的第一件事就是开发一种更好的测试/验证结果的方法。