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 回答