将二位色彩转换为八位色彩

3

我收到了六位的颜色数值,每个颜色由两位二进制数表示红、绿和蓝。因此,黑色用二进制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 R
@Paul 不,我确实是指48。 - Amarghosh
@Amarghosh:好的-相对于85来说,这似乎是一个非常大的差异-我想知道如果FACTOR = 85时匹配是“相当接近”,那么FACTOR = 48时为什么会是“几乎完美”的呢? - Paul R
@Paul - 我猜他的意思是视觉上的。显然,对于两个零位,使用什么映射都无关紧要,因此颜色越暗,不管使用什么值,匹配度就越高。几乎任何单调合理的映射都会“相当接近”。 - Nick Fortescue
如果是这样的话,除非我误解了您的意思,否则不可能有任何算法会根据是参考视频还是普通视频而产生不同的结果。 - Nick Fortescue
显示剩余2条评论
1个回答

5
我所知道的唯一标准是EGA——在维基百科上有一个参考。wikipedia。就算是64个值,6位存储空间也非常小。从CPU时间和内存的角度来看,最快的转换方式几乎肯定是查找一个大小为64的数组中的值。特别是如果你有测试数据,这非常容易——只需将测试数据中正确的64个值放入数组中即可。这样你就不必担心它是否符合标准——标准正是适用于此系统的任何内容。

颜色位确实以RrGgBb的形式输入;我尝试了rgbRGB的EGA格式,只是以防万一,但与我当前得到的近似匹配的颜色完全不同。 - Amarghosh
好的,但是我对于数组的评论仍然成立。这对你有意义吗? - Nick Fortescue
是的,我明白了。我希望有一个标准算法(也许考虑每个三个组件来计算单个组件的8位值);查找表方法肯定会在性能方面有所帮助 - 感谢您的建议。 - Amarghosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接