1

指定された 16 ビットのグレースケール値からビットマップを作成したいと考えています。これまでのところ、私はこのコードを持っています:

var value = CamData.ToArray();

        var b = new Bitmap(160, 112, PixelFormat.Format24bppRgb);
        var bdata = b.LockBits(new Rectangle(0, 0, 160, 112), ImageLockMode.WriteOnly, b.PixelFormat);

        unsafe
        {
            fixed (ushort* pData = &value[0])
            {
                Marshal.Copy((IntPtr)pData, new IntPtr[]{ bdata.Scan0}, 0, value.Length);
            }
        }
        b.UnlockBits(bdata);

しかし、Marshal.Copy Methode で「要求された範囲が配列の末尾を超えています」というエラーが表示されます。エラーはどこにありますか?

ありがとう

4

2 に答える 2

1

ポインターによって定義されたメモリ領域にコピーすることはできません。配列へのポインターではなく、実際の配列を渡す必要があります。サイズ 1 の配列を渡していますがIntPtr、これは機能しません。

于 2011-03-29T08:26:13.393 に答える
0

bdata.Scan0ロックされたメモリ領域の先頭を指すIntPtrです。配列でラップしないでください。また、配列をソースとしてMarshal.Copyを使用できます。したがって、コードは次のようになります。

Marshal.Copy(value, 0, bdata.Scan0, value.Length);

これは、Marshal.Copyのこのオーバーロードを使用します。

于 2011-03-29T08:37:59.030 に答える