2022/07/14(Thu) 15:57:03 編集(投稿者)
■No100272 (まさお さん) に返信
> 幅が4の倍数ではない201×100(仮)のイメージデータ(カラー)の描画をしたいのですがうまくいきません。
> 現在、下記のようにやっていますがMarshal.Copyのところでエラーになってしまいます。
> (エラー:'保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。')
> イメージデータを200×100にして下記引数の201を200にすると期待する描画ができます。
>
> Bitmap bitmap = new Bitmap(201, 100, 204, PixelFormat.Format24bppRgb, IntPtr.Zero))
> BitmapData bitmapData = bitmap.LockBits(
> new Rectangle(0, 0, 201, 100),
> ImageLockMode.WriteOnly,
> PixelFormat.Format24bppRgb);
> Marshal.Copy(scan0, 0, bitmapData.Scan0, scan0.Length); // ここでエラー
とりあえずデバッグして scan0.Lengthと、bitmapDataのStride*Height を確認してみてはいかがでしょう。
下記のコードで、pictureBox1が白色になるのは確認しましたが。
private void button1_Click(object sender, EventArgs e)
{
var scan0 = Enumerable.Repeat<byte>(0xff, (((201 * 3) + 1) * 100) ).ToArray(); //+1はパディング(横一行バイト数を4の倍数にする)
Bitmap bitmap = new Bitmap(201, 100, 204, PixelFormat.Format24bppRgb, IntPtr.Zero);
BitmapData bitmapData = bitmap.LockBits(
new Rectangle(0, 0, 201, 100),
ImageLockMode.WriteOnly,
PixelFormat.Format24bppRgb);
Marshal.Copy(scan0, 0, bitmapData.Scan0, scan0.Length);
bitmap.UnlockBits(bitmapData);
pictureBox1.Image = bitmap;
}
24bitBMPはパディング考慮する必要があり、画像処理する時に32bit単位で1ピクセル纏めて処理とかもしづらいので、32bitBMPの方が扱いやすいと思います。