0

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 分ほど待つと、これらのエラーは両方とも消えます。

4

1 に答える 1

1

最初のステップとして、tessnet コードを using ステートメントでラップします。

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

また、 using ステートメントにも含まれているため、 bmp.Dispose() を呼び出す必要はありません。

于 2013-07-26T17:12:27.393 に答える