次のような System.Drawing.Bitmap からデータをコピーする方法があります。
var readLock = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
byte[] data = new byte[3 * image.Width * image.Height];
if (data.Length != readLock.Stride * readLock.Height)
throw new InvalidOperationException("Incorrect number of bytes");
Marshal.Copy(readLock.Scan0, data , 0, data.Length);
image.UnlockBits(readLock);
非常にシンプルで、ほとんどの画像で機能します。ただし、非常に小さな画像 (14x14) の場合、例外が発生します。失敗した場合、ストライドは 44 であり、期待どおりの 42 (14 * 3) ではありません。
ピクセル形式は Format24bppRgb であるため、画像のピクセルごとに 3 バイトが必要です。これらの余分なバイトはどこから来ているのでしょうか?また、画像データを処理するときにどのように処理すればよいでしょうか?
興味のある人のために、私は高さマップから法線データを生成しているので、各ピクセルとその近傍を正確に取得できる必要があります)。