c# - Marshal.拷贝:试图读取或写入受保护的内存

本文关键字:受保护 内存 读取 Marshal 拷贝 | 更新日期: 2023-09-27 18:16:39

"试图读写受保护的内存。这通常表明其他内存已损坏。"

我在Marshal中遇到此错误。复制部分我的代码。我确信我的数据没有损坏,也没有受到保护。

我想知道在什么情况下会发生这种情况。我有一个位图列表。这只发生在我处理第一个索引[0]时。

我是这样做的:-首先,我使用了这段代码[这段代码获取位图的像素数据]:

        Bitmap tmp_bitmap = BitmapFromFile[0];
        Rectangle rect = new Rectangle(0, 0, tmp_bitmap.Width, tmp_bitmap.Height);
        System.Drawing.Imaging.BitmapData bmpData =
            tmp_bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
            PixelFormat.Format24bppRgb);
        int length = bmpData.Stride * bmpData.Height;
        byte[] bytes = new byte[length];
        // Copy bitmap to byte[]
        Marshal.Copy(bmpData.Scan0, bytes, 0, length);
        tmp_bitmap.UnlockBits(bmpData);

运行正常,没有错误发生

然后,我应用这个代码[这将删除像素数据线扫描填充]:

 byte[] bytes = new byte[bmpData.Width * bmpData.Height * 3];
 for (int y = 0; y < bmpData.Height; ++y) {
 IntPtr mem = (IntPtr)((long)bmpData.Scan0 + y * bmpData.Stride * 3);
 Marshal.Copy(mem, bytes, y * bmpData.Width * 3, bmpData.Width * 3); //This is where the exception is pointed.
 }

每当我处理第一张图像时,它就会给我这个错误——倒数第二张,根本没有问题。

我希望你能帮我解决这个问题。

c# - Marshal.拷贝:试图读取或写入受保护的内存

你似乎在考虑每一行3倍的步幅;您的代码将只适用于图像的前三分之一;在之后,您确实已经超出了允许的范围。基本上:

bmpData.Scan0 + y * bmpData.Stride * 3

看起来很可疑。"stride"每行使用的字节数(包括填充)。一般来说,就是:

bmpData.Scan0 + y * bmpData.Stride
相关文章: