我想根据给定的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方法中遇到错误:“请求的范围超出了数组的末尾”。错误在哪里?
感谢
答案 0 :(得分:1)
您无法复制到指针定义的内存区域:您需要传递实数组而不是指向数组的指针。您正在传递一个大小为1 IntPtr
的数组,但这不起作用。
答案 1 :(得分:0)
bdata.Scan0
是指向锁定内存区域开头的IntPtr。你不应该把它包装在一个数组中。您可以将Marshal.Copy与数组一起用作源。所以你的代码可能是:
Marshal.Copy(value, 0, bdata.Scan0, value.Length);