【解決方法】エラー: メモリが不足しています。画像をテキストに変換します。 (C#)


こんにちは、画像をテキストにしたいと思っています。 そして、画像(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 が発生することがわかります。

コメント

タイトルとURLをコピーしました