C#尝试读取或写入受保护内存错误

C#尝试读取或写入受保护内存错误,c#,C#,附录:当我取消选择“优化代码”时,它似乎运行正常,这让我相信这是一些奇怪的配置问题 首先,我尝试运行非托管代码。我已检查“允许不安全代码”。它指向这一行代码,我试图在不使用相对较慢的getpixel的情况下读取位图: byte[] buff = { scanline[xo], scanline[xo + 1], scanline[xo + 2], 0xff }; 整个片段如下。我怎样才能纠正这个问题 private const int PIXELSIZE = 4; /

附录:当我取消选择“优化代码”时,它似乎运行正常,这让我相信这是一些奇怪的配置问题

首先,我尝试运行非托管代码。我已检查“允许不安全代码”。它指向这一行代码,我试图在不使用相对较慢的getpixel的情况下读取位图:

byte[] buff = { scanline[xo], scanline[xo + 1], scanline[xo + 2], 0xff };
整个片段如下。我怎样才能纠正这个问题

private const int PIXELSIZE = 4;              // Number of bytes in a pixel

BitmapData mainImageData = mainImage.LockBits(new Rectangle(0, 0, mainImage.Width, mainImage.Height), ImageLockMode.ReadOnly, mainImage.PixelFormat);
List<Point> results = new List<Point>();

foundRects = new List<Rectangle>();

for (int y = 0; y < mainImageData.Height
{
        byte* scanline = (byte*)mainImageData.Scan0 + (y * mainImageData.Stride);

        for (int x = 0; x < mainImageData.Width; x++)
        {
            int xo = x * PIXELSIZE;
            byte[] buff = { scanline[xo], scanline[xo + 1], 
                    scanline[xo + 2], 0xff };
            int val = BitConverter.ToInt32(buff, 0);

            // Pixle value from subimage in desktop image
            if (pixels.ContainsKey(val) && NotFound(x, y))
            {
                Point loc = (Point)pixels[val];

                int sx = x - loc.X;
                int sy = y - loc.Y;
                // Subimage occurs in desktop image 
                if (ImageThere(mainImageData, subImage, sx, sy))
                {
                    Point p = new Point(x - loc.X, y - loc.Y);
                    results.Add(p);
                    foundRects.Add(new Rectangle(x, y, subImage.Width,
                                                               subImage.Height));
                }
          }
        }
private const int PIXELSIZE=4;//像素中的字节数
BitmapData mainImageData=mainImage.LockBits(新矩形(0,0,mainImage.Width,mainImage.Height),ImageLockMode.ReadOnly,mainImage.PixelFormat);
列表结果=新列表();
foundRects=新列表();
对于(int y=0;y
当x是mainImageData.Width-1时,xo+1和xo+2的值是多少?它们肯定是离开了保留地。

我们掌握的信息有限,很难说清楚,但我看到了几个明显的问题,其中一个直接解决了您的问题:

  • 您没有检查像素格式,但假设它是32bppRGB。很可能是24bppRGB,这可以解释错误

  • 您读取的RGB值不正确;Windows在内部按BGR顺序存储位图

  • 您没有在方法末尾调用UnlockBits


  • 最可能的原因是图像不是32bpp,它可能是24bpp,甚至可能是8或16位

    您应该从
    PixelFormat
    获取
    PIXELSIZE
    ,而不是将其硬编码为4


    检查您获得的步幅值是否与宽度一致。

    PIXELSIZE的值是多少?您确定图像的格式为32bppRGB吗?您不需要在代码中的任何地方指定或检查像素格式。此外,只需在循环之前将指针设置为Scan0一次,然后在内部循环中以PIX的形式递增它ElsizeMainImage.PixelFormat是什么?如果它是
    格式24bpprgb
    ,那么这就是为什么你要检查的原因。你不需要先“固定”内存块吗?不,这很好,x是像素,xo是字节。