我需要拍摄活动窗口的打印屏幕,并查看其中是否包含特定的子图像。要检查screenshot(largeImage)是否包含smallImage,我使用 AForge库(来自NuGet)/ ProcessImage()方法。在比较图像之后,我需要删除屏幕截图(largeImage),但是我得到一个例外:
该进程无法访问文件&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是我刚刚拍摄的截图。
我尝试使用(){}包装代码,但它给出了一个错误说:
在using语句中使用的类型必须可以隐式转换为&System; ID.IDisposable'
知道如何在使用后删除largeImage吗?
答案 0 :(得分:0)
在玩了一点之后我找到了两个解决方案:
解决方案1:
我必须在返回之前处理Bitmap对象:
largeImage.Dispose();
if (match.Length > 0)
{
return true;
}
return false;
解决方案2:
根据AForge文档,您应该使用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);
我分别在我的代码上测试了两个解决方案,两者都有效。