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);
我分别在我的代码上测试了这两个解决方案,并且都有效。
我需要截取活动 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);
我分别在我的代码上测试了这两个解决方案,并且都有效。