2016-08-17 12 views
2

すべてのピクセルのrgb値を知っていますが、どのようにC#でこれらの値で画像を作成できますか?私はこのようないくつかの例を見た:RGB配列をC#の画像に変換する

public Bitmap GetDataPicture(int w, int h, byte[] data) 
    { 

    Bitmap pic = new Bitmap(this.width, this.height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
    Color c; 

    for (int i = 0; i < data.length; i++) 
    { 
    c = Color.FromArgb(data[i]); 
    pic.SetPixel(i%w, i/w, c); 
    } 

    return pic; 
    } 

しかし、それは動作しません。

1 3 1 2 4 1 3 ...
2 3 4 2 4 1 3 ...
4 3 1 2 4 1 3 ...
: 私はこのような2次元アレイを有します...

各番号、RGB値に対応し、例えば、1 => {244,166,89} 2 => {54,68,125}。

+0

バイト配列の作成方法はわかりませんか? sometype [] myname = ... – BugFinder

+0

[バイト配列からビットマップを作成するにはどうすればいいですか?](http://stackoverflow.com/questions/21555394/how-to-ビットマップからバイト配列を作成する) – slawekwin

+0

上記の例は機能しますか? – Mangrio

答えて

0

あなたのソリューションは、作業コードに非常に近いです。 「パレット」、つまり3要素バイト配列のセットが必要です。各3バイト要素には{R、G、B}の値が含まれています。

//palette is a 256x3 table 
    public static Bitmap GetPictureFromData(int w, int h, byte[] data, byte[][] palette) 
    { 
     Bitmap pic = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
     Color c; 

     for (int i = 0; i < data.Length; i++) 
     { 
      byte[] color_bytes = palette[data[i]]; 
      c = Color.FromArgb(color_bytes[0], color_bytes[1], color_bytes[2]); 
      pic.SetPixel(i % w, i/w, c); 
     } 

     return pic; 
    } 

このコードは私にとっては機能しますが、非常に遅いです。

BMPファイルのメモリ内「イメージ」を作成し、Image.FromStream(MemoryStream( "image"))を使用すると、コードはより高速になりますが、より複雑なソリューションになります。

0

私は、パレット256のColorエントリの配列を(事前にこれを作成して入力する必要があり)を使用して、次のコード、試してみた:私はピクセルを反復する傾向

public Bitmap GetDataPicture(int w, int h, byte[] data) 
{ 
    Bitmap pic = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

    for (int x = 0; x < w; x++) 
    { 
     for (int y = 0; y < h; y++) 
     { 
      int arrayIndex = y * w + x; 
      Color c = palette[arrayIndex]; 
      pic.SetPixel(x, y, c); 
     } 
    } 

    return pic; 
} 

を、配列ではなく、単一ループとモジュロ/除算操作よりも二重ループを読みやすくなっています。

関連する問題