我正在将多个多图像tiff文件连接到单个多图像tiff文件,并且在删除源tiff文件时遇到问题,因为Image类继续保持它们的句柄。
我正在通过Image.FromFile阅读tiff图片:
Bitmap resultTiff = (Bitmap) Image.FromFile(strImageFile);
之后我以相同的方式读取所有其他tiff图像并将它们附加到生成的tiff图像。
当我完成后,我使用此代码来发布引用并保存生成的文件:
ep.Param[0] = new EncoderParameter(enc, (long) EncoderValue.Flush);
resultTiff.SaveAdd(ep);
resultTiff.Dispose();
现在问题是文件上的句柄仍然存在(因此无法删除文件),除非我在GC.Collect()
调用后调用resultTiff.Dispose()
。
您可以想象通过调用GC我感觉不舒服,那么还有其他方法可以实现吗?
答案 0 :(得分:17)
使用Image.FromFile
解决问题的最佳方法是使文件句柄处于打开状态,而不是使用Image.FromStream
。
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
using (Image original = Image.FromStream(fs))
{
...
使用显式Dispose(),using()语句或将值设置为null在垃圾收集发生之前不能解决问题。强制垃圾收集发生通常是一个坏主意。
答案 1 :(得分:5)
或尝试:
Using(Bitmap resultTiff = (Bitmap) Image.FromFile(strImageFile))
{
ep.Param[0] = new EncoderParameter(enc, (long) EncoderValue.Flush);
resultTiff.SaveAdd(ep);
}
答案 2 :(得分:1)
您可以尝试:
resultTiff = null;