将BitmapFrame用于元数据而不锁定文件
我发现在WPF中获取图像元数据的常用方法是创建一个BitmapFrame
对象并检查它上面的Metadata属性。 但是,我似乎无法创建满足以下两个要求的BitmapFrame
对象:
- 不锁定文件
- 在给定某些文件时,不会抛出奇怪的,未记录的exception
使用这些行似乎可靠地创建BitmapImage
:
BitmapFrame.Create(new Uri(imageName)); BitmapFrame.Create(new Uri(imageName), BitmapCreateOptions.DelayCreation, BitmapCacheOption.None);
然而,他们将文件锁定了不确定的时间。 据我所知, BitmapFrame
上没有dispose方法。
这样可以防止文件被锁定:
BitmapFrame.Create(new Uri(imageName), BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
但是在Vista上它会在某些文件上抛出ArgumentException
和InvalidOperationException
,而在Win7上会抛出FileFormatException
和IOException
。 这让我觉得缓存BitmapFrame
是不受支持/未经测试的。
你可以从WPF中的图像中获取元数据,而不会在不确定的时间内锁定文件吗?
您是否尝试过使用转换器方法? 例如,我的Intuipic应用程序执行此操作。 有关无锁定加载和BitmapOrientationConverter
获取元数据的详细信息,请参阅BitmapFrameConverter
。
我不知道此时的答案是否对任何人都有用,但由于我今天才到这里,我认为其他人可能会感兴趣。
尝试使用BitmapFrame测试图像是否有效时,我遇到了类似的问题,然后尝试重命名图像文件。 使用此代码,图像被锁定,并且Move命令不起作用:
bool isImageValid = true; try { BitmapFrame bmpFrame = BitmapFrame.Create(new Uri("C:\\Images\\Test.jpg")); } catch { isImageValid = false; } File.Move("C:\\Images\\Test.jpg", "C:\\Images\\Test0.jpg");
但是,当我第一次在文件流中读取图像文件时,只要完成using块并且Move命令工作,就会释放该文件:
bool isImageValid = true; try { using (FileStream fs = new FileStream("C:\\Images\\Test.jpg", FileMode.Open)) { BitmapFrame bmpFrame = BitmapFrame.Create(fs); } } catch { isImageValid = false; } File.Move("C:\\Images\\Test.jpg", "C:\\Images\\Test0.jpg");
尝试使用bitmapImage.StreamSource.Dispose()或bitmapImage.Freeze();