如何在c#中将RGB555转换为RGB888?

时间:2010-12-10 14:29:26

标签: c# rgb

我需要将16位XRGB1555转换为24位RGB888。我的功能如下所示,但它并不完美,即值为0b11111将得到248作为像素值,而不是255.此函数适用于little-endian,但可以很容易地修改为big-endian。

public static Color XRGB1555(byte b0, byte b1)
{ 
    return Color.FromArgb(0xFF, (b1 & 0x7C) << 1, ((b1 & 0x03) << 6) | ((b0 & 0xE0) >> 2), (b0 & 0x1F) << 3); 
}

任何想法如何使其发挥作用?

3 个答案:

答案 0 :(得分:7)

您通常会将最高位向下复制到最低位,因此如果您有五位,如下所示:

Bit position: 4 3 2 1 0
Bit variable: A B C D E

您可以将其扩展为8位:

Bit position: 7 6 5 4 3 2 1 0
Bit variable: A B C D E A B C

这样,所有零都保留为全零,所有零都变为全1,并且值之间的值适当。

(注意A,B,C等不应该是十六进制数字 - 它们是代表单个位的变量)。

答案 1 :(得分:2)

我会使用查找表。由于只有32个不同的值,它甚至可以放在缓存行中。

您可以通过以下方式从5位值获取8位值: return (x<<3)||(x>>2);

虽然四舍五入可能并不完美。即结果并不总是最接近输入,但它永远不会远离1/255。

答案 2 :(得分:0)

首先编写一些测试:

Color c = XRGB1555(0, 0) => expect c RGB == 0,0,0
Color c = XRGB1555(0xff, 0xff) => expect c RGB == ff,ff,ff.

其余的将随之而来!