将两位颜色转换为八位颜色

时间:2011-05-12 08:50:33

标签: c colors rgb directfb

我的颜色值为六位,红色,绿色和蓝色各有两位。因此,黑色将表示为二进制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(通过反复试验找到的值)时,颜色几乎完全匹配。

1 个答案:

答案 0 :(得分:5)

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

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