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

C# 读取位图时出现内存不足异常,c#,bitmap,tessnet2,C#,Bitmap,Tessnet2,TessNet2读取位图时出现内存不足异常。 它具体发生在tessocr.getthresholdeImage(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, set

TessNet2读取位图时出现内存不足异常。 它具体发生在
tessocr.getthresholdeImage(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++;
        }
    } 
}
这种情况并非总是发生,似乎只有在调试模式下运行了几次程序时才会发生(我还没有尝试将代码打包到exe中)。这是一个控制台应用程序

我读过关于使用
bmp.UnlockBits(bmpData)
的书,但是当我把代码放进去时;当点击
tessocr.getthresholdeImage(bmp,System.Drawing.Rectangle.Empty)时,我发现一个
位图区域已被锁定
错误。保存(“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++;
        }
    } 
}
for(int p=0;p
最终,当我尝试在此错误发生后运行代码几次时,它将开始使用(Bitmap bmp=image.ToBitmap())
行在
处抛出错误


如果我等待大约5或10分钟,这两个错误都会消失。

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

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

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

您的代码中如何定义
image
以及在哪里定义?我做了一个编辑,在代码中向您展示了一个想法:DoOCRMultiThread可能会启动一个新的线程,并开始对bmp进行OCR。当它发挥其魔力时,位图将保存在内存中,而不会被释放。可能是您的内存真的用完了。如果执行DoOCRNormal(),是否会出现内存不足错误?