我正在创建一个复古模拟器,并且在我的生活中无法记住如何将单字节转换为RGB值并从RGB返回到单个字节。
我尝试使用按位方法,但它似乎并不适合这种情况。
我发现此帖子类似,How can I make 3 bytes corresponding to RGB into a single byte?,但是由于返回的值大于255,我无法使其正常工作。
因此,为了理解,如果有人曾经拥有Atari ST或ZX Spectrum,那么颜色托盘非常紧凑,可以放入一个字节,而不像今天的4字节rgba。
有人可以慢慢记忆吗?
伪代码
int R = 1 (range 0 to 6);
int G = 3 (range 0 to 6);
int B = 5 (range 0 to 6);
// Convert values to single byte
byte myByte = (R << 2) + (G << 1) + (B)
// Convert byte back to RGB
R = myByte / ?;
G = myByte / ?;
B = myByte / ?
答案 0 :(得分:2)
如果您使用链接答案中提供的转换算法
rgb8 = [(Red / 32) << 5] + [(Green / 32) << 2] + (Blue / 64)
现在获取RGB
byte R = (byte) ((rgb8 & 0xE0) >> 5); // rgb8 & 1110 0000 >> 5
byte G = (byte) ((rgb8 & 0x1C) >> 2); // rgb8 & 0001 1100 >> 2
byte B = (byte) (rgb8 & 0x03); // rgb8 & 0000 0011
再次将其打包成一个字节
byte RGB = (byte)((R << 5) | (G << 2) | B);
答案 1 :(得分:-4)
Color.FromRgb方法(字节,字节,字节)
https://msdn.microsoft.com/en-us/library/system.windows.media.color.fromrgb(v=vs.110).aspx
逆转
b = (byte)(myColor & 0xFF);
g = (byte)((myColor >> 8) & 0xFF);
r = (byte)((myColor >> 16) & 0xFF);
a = (byte)((myColor >> 24) & 0xFF)