C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.100273 の関連記事表示

<< 0 >>
■100273  Re[1]: カラービットマップの描画について
□投稿者/ radian -(2022/07/14(Thu) 15:27:56)
    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の方が扱いやすいと思います。
記事No.100272 のレス /過去ログ174より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -