错误:内存不足,图像转文本。 (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

我看到两个问题,首先:

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 语句。 如果您需要告诉用户,您可以在之后检查,例如

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をコピーしました