2013-07-26 106 views
0

當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分鐘,這兩個錯誤都會消失。

+0

如何以及在代碼中定義了'image' ..? – MethodMan

+0

我做了一個編輯,在代碼中顯示 – MaylorTaylor

+0

只是一個想法:DoOCRMultiThread可能會啓動一個新線程並開始對bmp進行OCR。儘管它有它的魔力,但位圖會駐留在內存中,而不會被釋放。可能是你真的用完了內存。 如果您執行DoOCRNormal(),是否會發生內存不足錯誤? – ctrucza

回答

1

第一步我會包裝在using語句

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

你也不需要調用bmp.Dispose(),因爲這也是一個using語句的tessnet代碼。