我正在使用一个带有RGB565彩色显示器的旧设备。我们没有问题显示颜色的单位,但我们希望创建一些新的功能,所以我们想要模拟我们的测试程序的显示。这意味着,而不是从颜色转换到U16十六进制值…我们正在尝试将颜色转换为相同的U16十六进制值。
不幸的是,处理位移位的人不在我们身边,因为我对颜色和位移位很垃圾……我希望这里有人能看到下面的函数,并确切地知道如何做相反的。
THANKS IN ADVANCE
下面是从RGB565(每种颜色为Int32)到HEX (u16)的代码:
private byte[] ConvertRGB888COLORtoU16HEXasRGB565COLOR(Color color)
{
byte[] ReturnByte = new byte[2];
Int32 red;
Int32 green;
Int32 blue;
red = (Int32)Math.Floor(color.R * 31.0 / 255.0);
green = (Int32)Math.Floor(color.G * 63.0 / 255.0);
blue = (Int32)Math.Floor(color.B * 31.0 / 255.0);
byte byte0 = (byte)(((red & 0xFF) << 3) | ((green & 0xFF) >> 3));
byte byte1 = (byte)(((green & 0xFF) << 5) | (blue & 0xFF));
ReturnByte[0] = byte0;
ReturnByte[1] = byte1;
return ReturnByte;
}
我需要另一种方式的帮助,因为这个Bit Shift的东西对我来说像是胡言乱语。
我不知道如何将上面的内容翻转为备用,以填补下面不完整功能中明显的空白:
private Color ConvertU16HEXasRGB565COLORtoRGB888COLOR(byte BinaryLow, byte BinaryHigh)
{
** // HELP** ================
// BinaryLow & BinaryHigh (somehow)
// BinaryLow & BinaryHigh and form a U16 16-Bit RGB565 value!!
// I NEED PRIMARILY NEED HELP WITH THE OPPOSITE OF:
// byte BinaryLow = (byte)(((Red565 & 0xFF) << 3) | ((Green565 & 0xFF) >> 3));
// byte BinaryHigh = (byte)(((Green56 & 0xFF) << 5) | (R5 & 0xFF));
// TO GET THE BELOW:
// Int32 Red565 = OPPOSITE ABOVE;
// Int32 Green565 = OPPOSITE ABOVE;
// Int32 Blue565 = OPPOSITE ABOVE;
** // HELP** ================
int Red888 = (int) floor(Red565 * 255.0 / 31.0 + 0.5);
int Green888 = (int) floor(Green56 * 255.0 / 63.0 + 0.5);
int Blue888 = (int) floor(Red565 * 255.0 / 31.0 + 0.5);
Color ReturnColor = Color.FromArgb(Red888, Green888, Blue888);
return ReturnColor;
}
你说你不懂位移位。这方面很容易解释:它只是移动二进制值中的字节。
例如,如果我们在a
中从0010开始,那么我们得到以下结果:
Op | Result | Result as Decimal | 0010 | 2 |
---|---|---|
& lt; & lt;1 | 0100 | 4 |
& lt; & lt;2 | 1000 | 8 |
祝辞;比;1 | 0001 | 1 |
祝辞;比;2 | 0000 | 0 |