单字节到RGB和RGB到单字节

时间:2017-01-02 00:26:16

标签: c#

我正在创建一个复古模拟器,并且在我的生活中无法记住如何将单字节转换为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 / ?

2 个答案:

答案 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)