読者です 読者をやめる 読者になる 読者になる

C#で配列からBitmapを作成する

unsafeコードのお世話にならないといけませんが、それを許容できるのであれば、バイト配列のfixedなポインタを取得して、そこからBitmapを作れます。strideが4バイトアラインじゃないとか、正数でないといけないのが微妙に残念です。
しかしながら、この方法でできるBitmapインスタンスは、元の配列のコピーではなく、その領域をそのまま利用するので、何らかの理由からか、画像がバイト配列で提供されている、あるいは、画像をバイト配列として操作しないといけないなどという場合には非常に便利でしょう。

using System;
using System.Drawing;

public class Test
{
  public static void Main(string[] args)
  {
    int w = 1024;
    int h = 1024;
    int stride = (w * 3 + 3) & ~3; // BGR 4バイトアライン
    byte[] buf = new byte[stride * h];
    
    // ごにょごにょ #1
    // 配列に対して直接画像処理を行える

    unsafe
    {
      fixed(byte* p = &buf[0])
      {
        // ごにょごにょ #2
        // ポインタに対して直接画像処理を行える
        
        using(Bitmap bmp = new Bitmap(w, h, stride,
          System.Drawing.Imaging.PixelFormat.Format24bppRgb,
          new IntPtr(p)))
        {
          // ごにょごにょ #3
          // 配列のメモリ領域はBitmapと共有されているので、
          // 当然、ここでもポインタ/配列に対して処理を行う
          // ことができる

          bmp.Save(args[0]);
        }
      }
    }
  }
}