0

我在 Stack Overflow 上看到过类似的帖子,但没有一个与我正在尝试做的完全一样。这就是为什么我提出了一个新问题。

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

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

(在下面的代码中,RTA 是一个屏幕截图,并且 numbers 数组包含数字 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);
                }
            }
        }
    }
4

0 回答 0