Stack Overflow で同様の投稿を見たことがありますが、私がやろうとしていることとまったく同じものはありません。そのため、新しい質問を作成しました。
画面の小さな部分を英数字のビットマップと比較して、スクリーンショットを OCR しようとしています。(この質問の目的のために、それがOCRの許容可能な方法であると仮定してください-私はそれが本当に良い方法でも効率的な方法でもないことを知っています)。比較をより高速に実行するために lockbits メソッドを使用しています (免責事項: 昨夜 StackOverflow/Google から学んだ [Marshal を含む] lockbits メソッドについて知っていることはすべて...それほど多くはありません)。コードを実行しようとすると、「保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。」という 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);
}
}
}
}