2016-03-30 40 views
0

我需要打印一個活動窗口的屏幕,並確定它是否包含其中的特定子圖像。要檢查截圖(largeImage)是否包含smallImage,我使用AForge庫(來自NuGet)/ ProcessImage()方法。圖像比較後,我需要刪除的截圖(largeImage),但我得到一個異常的說法:因爲它正在被其他進程使用:「\ largeImage C」AForge.Imaging ProcessImage()方法不釋放圖像文件

該進程無法訪問該文件。

經過一些調試後,我可以看到它是鎖定文件的FindSubImage()方法。

FindSubImage()來實現這樣的:

private bool FindSubImage(string largeImagePath, string smallImagePath) 
{ 
    Bitmap largeImage = (Bitmap)Bitmap.FromFile(largeImagePath); 
    Bitmap smallImage = (Bitmap)Bitmap.FromFile(smallImagePath); 

    ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching(0.8f); 

    TemplateMatch[] match = tm.ProcessImage(largeImage, smallImage); 
    if (match.Length > 0) 
    { 
     return true; 
    } 
    return false; 
} 

largeImage是ofcourse我只是把截圖。

我試着用(){}包裝的代碼,但它給了我一個錯誤說:在使用語句中使用

類型必須是隱式轉換爲「System.IDisposable的」

任何想法如何在使用後刪除largeImage?

回答

0

扮演的是一個經過我設法找到了兩種解決方案:

解決方法1:

我不得不返回之前處置Bitmap對象:

largeImage.Dispose();  
if (match.Length > 0) 
{ 
    return true; 
} 
return false; 

解決方案2:

根據AForge文檔,你可以d使用AForge方法從文件加載圖片,這可以通過鎖定文件來解決.NET問題。所以我代替我的代碼,我在那裏加載的位圖文件,從這個:

//Bitmap mainImage = (Bitmap)Bitmap.FromFile(mainImagePath); 
//Bitmap subImage = (Bitmap)Bitmap.FromFile(subImagePath); 
Bitmap mainImage = AForge.Imaging.Image.FromFile(mainImagePath); 
Bitmap subImage = AForge.Imaging.Image.FromFile(subImagePath); 

我測試分別在我的代碼,這兩種解決方案都與工作。