我的程序使用一些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
类属性。
这可能吗?如果是这样,它是如何完成的?
答案 0 :(得分:2)
不需要进行此转换。 BitmapImage
MSDN页面中的“备注”部分显示:
BitmapImage主要用于支持可扩展应用程序标记 语言(XAML)语法并为位图引入了其他属性 加载未由BitmapSource定义。
使用位图时,您的应用程序通常应始终使用BitmapSource
或ImageSource
基类。例如,当您分配WPF Image控件的Source
属性时,您可以使用从ImageSource
派生的任何类型的实例,因为这是Source
属性的类型。
因此,您可以直接使用BitmapFrame
,因为它也来自ImageSource
:
var bitmap = BitmapFrame.Create(
memoryStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
image.Source = bitmap;