當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' ..? – MethodMan
我做了一個編輯,在代碼中顯示 – MaylorTaylor
只是一個想法:DoOCRMultiThread可能會啓動一個新線程並開始對bmp進行OCR。儘管它有它的魔力,但位圖會駐留在內存中,而不會被釋放。可能是你真的用完了內存。 如果您執行DoOCRNormal(),是否會發生內存不足錯誤? – ctrucza