如何将BitmapFrame转换为BitmapImage

时间:2014-03-17 23:54:43

标签: c# wpf

我的程序使用一些WPF API来处理文件夹中的图像。我需要解析图像中的EXIF数据(如果有)以获取DateTimeOriginal属性的值。我一直在使用BitmapImage来加载MemoryStream中的图片,但我需要一个BitmapFrame对象来获取BitmapMetadata对象。

在我获得DateTimeOriginal EXIF属性的要求之前,这是我的原始代码:

BitmapImage src = new BitmapImage();
try {
    using ( MemoryStream memoryStream = new MemoryStream( snapshot.ImageData ) ) {
        src.BeginInit();
        src.CacheOption  = BitmapCacheOption.OnLoad;
        src.StreamSource = memoryStream;
        src.EndInit();
    }
} catch ( NotSupportedException ex ) {
    . . .
}

现在,要获得BitmapFrame,我需要创建一个BitmapDecoder并使用Frames[0]属性。所以我在using声明之后添加了以下内容:

BitmapDecoder decoder = BitmapDecoder.Create( memoryStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad );

这会对位图进行解码并获得第一帧,这很酷。我仍然需要创建BitmapImage。我可以通过将MemoryStream's位置重新设置为开头并保留已存在的代码来实现,但这将再次解码相同的图像。

我有没有办法将BitmapFrame转换为BitmapImage?我以为我会将BitmapFrame转换为BitmapSource对象,然后设置BitmapImage's Source属性,但BitmapImage类似乎没有Source类属性。

这可能吗?如果是这样,它是如何完成的?

1 个答案:

答案 0 :(得分:2)

不需要进行此转换。 BitmapImage MSDN页面中的“备注”部分显示:

  

BitmapImage主要用于支持可扩展应用程序标记   语言(XAML)语法并为位图引入了其他属性   加载未由BitmapSource定义。

使用位图时,您的应用程序通常应始终使用BitmapSourceImageSource基类。例如,当您分配WPF Image控件的Source属性时,您可以使用从ImageSource派生的任何类型的实例,因为这是Source属性的类型。

因此,您可以直接使用BitmapFrame,因为它也来自ImageSource

var bitmap = BitmapFrame.Create(
    memoryStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);

image.Source = bitmap;