当TessNet2读取我的位图时,我得到了内存不足异常。
它专门发生在tessocr.GetThresholdedImage(bmp, System.Drawing.Rectangle.Empty).Save("c:\\temp\\" + Guid.NewGuid().ToString() + ".bmp");
行。
这并不是一直发生的,似乎只有在我在调试模式下运行程序几次时才会发生(我还没试过将代码打包到exe中) 。这是一个控制台应用程序。
我已经阅读了有关使用bmp.UnlockBits(bmpData)
的内容,但是当我将该代码放入其中时;当它到达Bitmap region is already locked
行时出现tessocr.GetThresholdedImage(bmp, System.Drawing.Rectangle.Empty).Save("c:\\temp\\" + Guid.NewGuid().ToString() + ".bmp");
错误。
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分钟,这两个错误都会消失。
答案 0 :(得分:1)
作为第一步,我将把tessnet代码包装在using语句中
using(tessnet2.Tesseract tessocr = new tessnet2.Tesseract())
{
tessocr.Init(...);
}
您也不需要调用bmp.Dispose(),因为它也在using语句中。