2017-01-02 2 views
0

Я создаю ретро-эмулятор и не могу вспомнить, как преобразовать один байт в значение RGB и обратно из RGB в один байт.Одиночный байт для 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/? 
+1

Максимальное значение 6 в этой ситуации указывает максимальную интенсивность цвета? –

+0

3 бит на канал, 3 канала -> 9 бит. Как это должно помещаться в 1 байт? Кроме того, R, G и B будут перекрываться, потому что они являются только сдвигом по 1 бит. Этот код не работает. Если вы хотите поместить цвет в один байт, вам нужно использовать палитру (например, GIF) или пожертвовать одним битом (желательно не зеленым), как в вопросе, который вы связали. –

+0

Возможный дубликат [Как я могу сделать 3 байта, соответствующих RGB, в один байт?] (Http://stackoverflow.com/questions/12222992/how-can-i-make-3-bytes-corresponding-to-rgb -into-a-single-byte) –

ответ

0

Это окончательное редактирование.

Итак, вот как конвертировать полный RGB в цвет ретро качества, который может храниться как один байт.

static void Main(string[] args) 
{ 
    byte rgb = Compress(System.Drawing.Color.Bisque); 

    System.Drawing.Color col = Decompress(rgb); 

    Console.ReadLine();    
} 

public static byte Compress(System.Drawing.Color color) 
{ 
    // Convert from modern RGB to Retro quality colors and store value in 1 byte. 
    int r = (int)(color.R/255.00 * 5); 
    int g = (int)(color.G/255.00 * 5); 
    int b = (int)(color.G/255.00 * 5); 
    byte rgb = (byte)(r + (g * 6) + (b * 40)); 

    Console.WriteLine("R={0} G={1} B={2} Byte={3}", r, g, b, rgb); 
    return rgb; 
} 

public static System.Drawing.Color Decompress(byte value) 
{ 
    // obtain rgb values from byte and convert back to moden rgb value. 
    int rgb = (int)value; 
    int b = (int)(rgb/40.00); 

    rgb -= (b * 40); 
    int g = (int)(rgb/6.00); 

    rgb -= (g * 6); 
    int r = rgb; 

    Console.WriteLine("R={0} G={1} B={2} Byte={3}", r, g, b, value); 
    return System.Drawing.Color.FromArgb((int)(r/(double)5 * 255), (int)(g/(double)5 * 255), (int)(b/(double)5 * 255)); 
} 
-3

Color.FromRgb метод (Byte, Byte, Byte)

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) 
+1

Вместо того, чтобы редактировать ответ, как насчет того, чтобы вы прочитали вопрос? Эта текущая итерация вашего ответа разбивает Uint32 на компоненты ARGB -> до сих пор нет отношения к вопросу. –

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); 
+0

@ Overdrive77 есть ли там проблемы? –

+0

Просто не может заставить этот метод работать, поскольку он возвращает 0? Опубликованный метод основан на современных параметрах r 255, g 255 и b 255 – Overdrive77

Смежные вопросы