[ad_1]
こんにちは、画像をテキストにしたいと思っています。 そして、画像(oCr)からテキストを見つけたいです。 しかし、エラーが発生します。 「メモリが不足しています」
私のコード:
C#
private Image DetectNumbers2(Image img, Color c) { try { Bitmap bimg = new Bitmap(img); for (int x = 0; x < bimg.Width - 1; x++) { for (int y = 0; y < bimg.Height - 1; y++) { Color c2 = bimg.GetPixel(x, y); if (c2.R >= 240 && c2.R <= 255 && c2.G >= 45 && c2.G <= 60 && c2.B >= 45 && c2.B <= 60) { var img2 = bimg.Clone(new Rectangle(x, y, bimg.Height-y-1, bimg.Width-x-1), pictureBox3.Image.PixelFormat); return img; } } } return null; } catch (Exception ex) { MessageBox.Show(ex.Message); return null; } }
私のボタン:
C#
if (DetectNumbers2(pictureBox6.Image, GetReadColor(int.Parse(label1.Text))) != null) pictureBox11.Image = DetectNumbers2(pictureBox6.Image, GetReadColor(int.Parse(label1.Text)));
解決策 1
まず 2 つの問題があると思います。
C#
if (DetectNumbers2(pictureBox6.Image, GetReadColor(int.Parse(label1.Text))) != null) pictureBox11.Image = DetectNumbers2(pictureBox6.Image, GetReadColor(int.Parse(label1.Text)));
OCR は高価であり、たとえ画像の一部を返すだけであっても、(GetPixel を使用して) 行っていることは非常に高価です。 では、なぜまったく同じことを二度も行うのでしょうか? 画像に Null を割り当てることができます。これを行うだけです。
C#
pictureBox11.Image = DetectNumbers2(pictureBox6.Image, GetReadColor(int.Parse(label1.Text)));
そして、If ステートメントは省略します。 ユーザーに伝える必要がある場合は、次のように AFTER を確認できます。
C#
if (pictureBox11.Image == null) //Tell the user that it failed....
次は次の行です。これが問題の原因である可能性があります。
C#
var img2 = bimg.Clone(new Rectangle(x, y, bimg.Height-y-1, bimg.Width-x-1), pictureBox3.Image.PixelFormat);
長方形は (x、y、幅、高さ) として定義されます。 それを (x, y, 高さ, 幅) として定義しようとしていますが、これは間違っています。
のドキュメントを見ると、 System.Drawing.Bitmap.Clone()[^] 四角形の幅/高さが元のビットマップの境界外にある場合、OutOfMemoryException が発生することがわかります。
[ad_2]
コメント