2017-01-02 6 views
0

私はレトロなエミュレータを作成していますが、を1バイトのRGB値に戻して1バイトに変換する方法を覚えていません。シングルバイトからRGBへ、そしてRGBからシングルバイトへ

ビットごとの方法を試しましたが、このシナリオではうまくいかないようです。

私はしかし、私はちょうどそれは誰もがアタリSTを持っていた場合は返される値は、理解のために255より大きい

だから、あるとして仕事を得ることができない、How can I make 3 bytes corresponding to RGB into a single byte?似ている、この記事を見つけた

またはZX Spectrumでは、カラーパレットは非常にコンパクトで、1バイトに収まるようになり、今日の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ビットずつしかシフトされないため、重複します。そのコードは機能しません。 1つのByteに色を合わせたい場合は、パレット(GIFなど)を使用するか、リンクした質問のように1ビット(好ましくは緑色ではない)を犠牲にする必要があります。 –

+0

[RGBに対応する3バイトを1バイトにするにはどうしたらよいですか?](http://stackoverflow.com/questions/12222992/how-can-i-make-3-bytes-corresponding-to-rgb -into-a-single-byte) –

答えて

0

を、それをパックします。

ここでは、完全なRGBをレトロな高品質の色に変換する方法を示します。これを1バイトとして保存することができます。

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法(バイト、バイト、バイト)

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

リンクされた答えに与えられた変換アルゴリズムを使用している場合

今3210
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 

を取得し、これが最終的な編集である

再び1バイトで
byte RGB = (byte)((R << 5) | (G << 2) | B); 
+0

@ Overdrive77そこに問題がありますか? –

+0

0を返すようにそのメソッドを動作させることはできません。ポストされたメソッドは、現代r 255、g 255およびb 255に基づいています。 – Overdrive77

関連する問題