Lỗi: Không đủ bộ nhớ, hình ảnh thành văn bản. (C#)

lập trình


Xin chào, tôi muốn tạo một hình ảnh thành văn bản. Và tôi muốn tìm văn bản từ hình ảnh (oCr). Nhưng nó báo lỗi. “Không đủ bộ nhớ”

Mã của tôi:

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;
        }
    }

Nút của tôi:

C#
if (DetectNumbers2(pictureBox6.Image, GetReadColor(int.Parse(label1.Text))) != null) pictureBox11.Image = DetectNumbers2(pictureBox6.Image, GetReadColor(int.Parse(label1.Text)));

Giải pháp 1

Tôi thấy hai vấn đề, đầu tiên:

C#
if (DetectNumbers2(pictureBox6.Image, GetReadColor(int.Parse(label1.Text))) != null) pictureBox11.Image = DetectNumbers2(pictureBox6.Image, GetReadColor(int.Parse(label1.Text)));

OCR rất tốn kém và những gì bạn đang làm (sử dụng GetPixel) RẤT RẤT tốn kém, ngay cả khi bạn chỉ trả lại một phần hình ảnh. Vậy tại sao bạn lại làm điều tương tự hai lần? Bạn có thể gán Null cho một hình ảnh, chỉ cần làm điều này:

C#
pictureBox11.Image = DetectNumbers2(pictureBox6.Image, GetReadColor(int.Parse(label1.Text)));

Và bỏ đi câu lệnh If. Nếu bạn cần thông báo cho người dùng, bạn có thể kiểm tra SAU, như

C#
if (pictureBox11.Image == null)
  //Tell the user that it failed....

Tiếp theo là dòng này, có thể là nguồn gốc của vấn đề của bạn:

C#
var img2 = bimg.Clone(new Rectangle(x, y, bimg.Height-y-1, bimg.Width-x-1), pictureBox3.Image.PixelFormat);

Hình chữ nhật được định nghĩa là: (x, y, Chiều rộng, Chiều cao). Bạn đang cố định nghĩa nó là (x, y, Chiều cao, Chiều rộng), điều này sai.

Nếu bạn nhìn vào tài liệu cho System.draw.Bitmap.Clone()[^] Bạn có thể thấy nó đưa ra Ngoại lệ OutOfMemoryException nếu chiều rộng/chiều cao của hình chữ nhật nằm ngoài giới hạn của bitmap gốc.

コメント

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