2016-03-30 18 views
0

アクティブなウィンドウの印刷画面を表示し、その中に特定のサブイメージが含まれているかどうかを調べる必要があります。 screenshot(largeImage)にsmallImageが含まれているかどうかを確認するには、AForgeライブラリ(NuGet製)/ ProcessImage()メソッドを使用します。画像を比較した結果、スクリーンショット(largeImage)を削除する必要がありますが、例外が発生しました:AForge.Imaging ProcessImage()メソッドでイメージファイルが解放されない

他のプロセスで使用されているため、プロセスはファイル 'c:\ largeImage'にアクセスできません。

一部のデバッグ後、ファイルをロックしているのが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のです。

は私が} {)(使用してコードをラップしようとしたが、それは言って私にエラーを与える:usingステートメントで使用

タイプは「System.IDisposable」に暗黙的に変換可能でなければなりません

使用後にlargeImageを削除する方法はありますか?

答えて

0

もう少し私は2つの解決策を見つけるために管理演奏後:

解決法1:

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

をソリューション2:

を私が返す前にBitmapオブジェクトを処分しなければなりませんでした。

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); 

私は別にコードと仕事の両方で両方のソリューションをテストしました。

関連する問題