我需要将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);
}
任何想法如何使其发挥作用?
答案 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.
其余的将随之而来!