【问题标题】:Out of Memory exception when reading bitmap读取位图时出现内存不足异常
【发布时间】:2013-07-26 16:14:50
【问题描述】:

TessNet2 读取我的位图时出现内存不足异常。 它专门发生在tessocr.GetThresholdedImage(bmp, System.Drawing.Rectangle.Empty).Save("c:\\temp\\" + Guid.NewGuid().ToString() + ".bmp"); 行。

这不会一直发生,它似乎只有在我以调试模式运行程序几次时才会发生(我还没有尝试将代码打包成 exe)。这是一个控制台应用程序。

我已经阅读了有关使用 bmp.UnlockBits(bmpData) 的信息,但是当我输入该代码时;当它到达tessocr.GetThresholdedImage(bmp, System.Drawing.Rectangle.Empty).Save("c:\\temp\\" + Guid.NewGuid().ToString() + ".bmp"); 行时,我收到Bitmap region is already locked 错误。

for (int p = 0; p < pdfFiles.Count(); p++)
{
    images.Read(@"c:\temp\pdfs\" + pdfFiles[p].Name, settings);

    int pageNumber = 1;
    string pdfName = pdfFiles[p].Name;

    //__loop through each page of pdfFile
    foreach (MagickImage image in images)
    {                                   
        using (Bitmap bmp = image.ToBitmap())
        {                                                                    
            Console.WriteLine("PDF Filename: " + pdfName);
            Console.WriteLine("Page Number: " + pageNumber + " of " + images.Count);

            tessnet2.Tesseract tessocr = new tessnet2.Tesseract();
            //TODO change folder to startup Path
            tessocr.Init(@"C:\Users\Matt Taylor\Documents\Visual Studio 2012\Projects\TessNet2\TessNet2\bin\Debug\tessdata", "eng", false);

            tessocr.GetThresholdedImage(bmp, System.Drawing.Rectangle.Empty).Save("c:\\temp\\" + Guid.NewGuid().ToString() + ".bmp");
            //Tessdata directory must be in the directory than this exe
            Console.WriteLine("Multithread version");

            ocr.DoOCRMultiThred(bmp, "eng");
            //Console.WriteLine("Normal version");
            //ocr.DoOCRNormal(bmp, "eng");    
            //bmp.UnlockBits(bmp);
            bmp.Dispose();

            pageNumber++;
        }
    } 
}

最终,一旦我在此错误发生后尝试运行代码几次,它将开始在 using (Bitmap bmp = image.ToBitmap()) 行抛出错误。

如果我等待大约 5 或 10 分钟,这两个错误都会消失。

【问题讨论】:

  • image 在您的代码中如何以及在何处定义.. ?
  • 我进行了编辑,以便在代码中向您展示
  • 只是一个想法:DoOCRMultiThread 可能会启动一个新线程并开始对 bmp 进行 OCR。虽然它发挥了作用,但位图将位于内存中,不会被释放。可能是您确实内存不足。如果您执行 DoOCRNormal(),您是否会出现内存不足错误?

标签: c# bitmap tessnet2


【解决方案1】:

作为第一步,我会将 tessnet 代码包装在 using 语句中

using(tessnet2.Tesseract tessocr = new tessnet2.Tesseract())
{
   tessocr.Init(...);
}

您也不需要调用 bmp.Dispose(),因为它也在 using 语句中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    相关资源
    最近更新 更多