AForge.Imaging ProcessImage()方法不会释放图像文件

时间:2016-03-30 13:36:56

标签: c# io delete-file aforge imaging

我需要拍摄活动窗口的打印屏幕,并查看其中是否包含特定的子图像。要检查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吗?

1 个答案:

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

我分别在我的代码上测试了两个解决方案,两者都有效。