とを使用Lockbits
しMarshal.Copy
ます:
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
System.Drawing.Imaging.BitmapData bmpData =
bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = Math.Abs(bmpData.Stride) * bmp.Height;
byte[] rgbValues = new byte[bytes];
// Copy the RGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
// do something with the array
// Copy the RGB values back to the bitmap
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
bmp.UnlockBits(bmpData);
注: コードは基本的にLockBits
ドキュメント ページのサンプル コードですが、コードには制限があります。Stride
値が正であること、つまり画像がメモリに逆さまに格納されていないことを前提としていますが、値にMath.Abs
on を使用するとStride
、コードを書いている人がStride
値が負になる可能性があることを認識していたことが示されます。
負Stride
の値の場合Scan0
、最初のスキャン ラインのアドレスであるため、連続メモリ ブロックの開始アドレスとして使用することはできません。メモリ ブロックの開始アドレスは、イメージの最初の行ではなく、最後の行の開始アドレスになります。
その住所はbmpData.Scan0 + bmpData.Stride * (bmp.Height - 1)