[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
我看到两个问题,首先:
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。
[ad_2]
コメント