读取位图时出现内存不足异常

本文关键字:内存不足 异常 位图 读取 | 更新日期: 2023-09-27 18:25:15

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分钟,这两个错误都会消失。

读取位图时出现内存不足异常

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

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

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