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

AForge.Imaging ProcessImage() method doesn't release the image file

我需要截取活动 window 的打印屏幕,看看它是否包含特定的子图像。要检查屏幕截图 (largeImage) 是否包含 smallImage,我使用 AForge 库(来自 NuGet)/ ProcessImage() 方法。比较图像后,我需要删除屏幕截图 (largeImage),但出现异常:

The process cannot access the file 'c:\largeImage' because it is being used by another process.

经过一些调试后,我发现是 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(){} 包装代码,但它给我一个错误提示:

type used in a using statement must be implicitly convertible to 'System.IDisposable'

知道如何在使用后删除 largeImage 吗?

玩了一会儿后,我找到了两个解决方案:

解决方案1:

我必须在返回之前处理 Bitmap 对象:

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

方案二:

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

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