使用Marshal.Copy时出现System.AccessViolation异常

时间:2015-10-22 18:18:20

标签: c# bitmap marshalling lockbits

我在Stack Overflow上看过类似的帖子,但没有一个与我想要做的完全相同。这就是我提出新问题的原因。

我试图通过将屏幕的小部分与字母数字字符的位图进行比较来对屏幕截图进行OCR。 (出于这个问题的目的,假设这是一种可接受的OCR方法 - 我知道它根本不是一个好的或有效的方法)。我正在使用lockbits方法更快地运行比较(免责声明:我所知道的关于lockbits方法[包括Marshal]的一切我昨晚从StackOverflow / Google学到的......所以并不多)。当我尝试运行代码时,我得到一个System.AccessViolation异常,说明"尝试读取或写入受保护的内存。这通常表明其他内存已损坏。"

System.Runtime.InteropServices.Marshal.Copy(bmd1.Scan0,b1bytes,0,bytes)发生错误;下面的一行。谁能告诉我为什么我会收到这个错误?以及如何避免它?

(在下面的代码中,RTA是一个屏幕截图,数字数组包含数字0 - 9的位图)

提前多多谢谢!

void OCRByComparison()
    {
        Rectangle crop = new Rectangle(0, 0, 9, 10);

        int bytes = RTA.Width * RTA.Height * (Image.GetPixelFormatSize(RTA.PixelFormat) / 8);
        byte[] b1bytes = new byte[bytes];
        byte[] b2bytes = new byte[bytes];

        for(int i = 1; i < RTA.Width - 11; i++)
        {
            for(int j = 0; j < RTA.Height - 12; j++)
            {
                crop.Location = new Point(i,j);
                Bitmap croppedBitmap = RTA.Clone(crop, RTA.PixelFormat);


                int percentEqual = 0;
                for(int n = 0; n < numbers.Length; n++)
                {
                    BitmapData bmd1 = RTA.LockBits(crop, ImageLockMode.ReadOnly, RTA.PixelFormat);
                    BitmapData bmd2 = numbers[n].LockBits(crop, ImageLockMode.ReadOnly, numbers[n].PixelFormat);

                    System.Runtime.InteropServices.Marshal.Copy(bmd1.Scan0, b1bytes, 0, bytes);
                    System.Runtime.InteropServices.Marshal.Copy(bmd2.Scan0, b2bytes, 0, bytes);

                    for (int m = 0; m < bytes; m++)
                    {
                        if (b1bytes[m] == b2bytes[m])
                        {
                            percentEqual++;
                        }
                    }

                    RTA.UnlockBits(bmd1);
                    numbers[n].UnlockBits(bmd2);
                }
            }
        }
    }

0 个答案:

没有答案