将BitmapFrame用于元数据而不锁定文件

我发现在WPF中获取图像元数据的常用方法是创建一个BitmapFrame对象并检查它上面的Metadata属性。 但是,我似乎无法创建满足以下两个要求的BitmapFrame对象:

  1. 不锁定文件
  2. 在给定某些文件时,不会抛出奇怪的,未记录的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上它会在某些文件上抛出ArgumentExceptionInvalidOperationException ,而在Win7上会抛出FileFormatExceptionIOException 。 这让我觉得缓存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();