WPF BitmapFrame 到 BitmapImage
WPF BitmapFrame to BitmapImage
我有一个来自反序列化的 BitmapFrame。我需要将其转换为 BitmapImage。怎么做?
我使用了这段代码:
问题是 BitmapImage 没有 Source 属性,只有 StreamSource 或 UriSource。
序列化部分:
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
MemoryStream stream = new MemoryStream();
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(image.UriSource));
encoder.QualityLevel = 30;
encoder.Save(stream);
stream.Flush();
info.AddValue("Image", stream.ToArray());
...
反序列化:
public ImageInfo(SerializationInfo info, StreamingContext context)
{
//Deserialization Constructorbyte[] encodedimage = (byte[])info.GetValue("Image", typeof(byte[]));
if (encodedimage != null)
{
MemoryStream stream = new MemoryStream(encodedimage);
JpegBitmapDecoder decoder = new JpegBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.Default);
Image = new BitmapImage();
Image.BeginInit();
//Image.StreamSource = ... decoder.Frames[0];
Image.EndInit();
Image.Freeze();
}
...
我需要一些有效的东西来代替上面的评论...
除此之外,您实际上并不需要这种转换(因为您可以在任何使用 BitmapImage 的地方使用 BitmapFrame),您可以直接从字节数组中的编码位图中解码 BitmapImage。
没有必要显式使用 BitmapDecoder。当您将 Stream 分配给 BitmapImage 的 StreamSource
属性 时,框架会自动使用适当的解码器。在创建 BitmapImage 后应立即关闭 Stream 时,您必须注意设置 BitmapCacheOption.OnLoad
。
Image = new BitmapImage();
using (var stream = new MemoryStream(encodedimage))
{
Image.BeginInit();
Image.CacheOption = BitmapCacheOption.OnLoad;
Image.StreamSource = stream;
Image.EndInit();
}
Image.Freeze();
我有一个来自反序列化的 BitmapFrame。我需要将其转换为 BitmapImage。怎么做? 我使用了这段代码:
问题是 BitmapImage 没有 Source 属性,只有 StreamSource 或 UriSource。
序列化部分:
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
MemoryStream stream = new MemoryStream();
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(image.UriSource));
encoder.QualityLevel = 30;
encoder.Save(stream);
stream.Flush();
info.AddValue("Image", stream.ToArray());
...
反序列化:
public ImageInfo(SerializationInfo info, StreamingContext context)
{
//Deserialization Constructorbyte[] encodedimage = (byte[])info.GetValue("Image", typeof(byte[]));
if (encodedimage != null)
{
MemoryStream stream = new MemoryStream(encodedimage);
JpegBitmapDecoder decoder = new JpegBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.Default);
Image = new BitmapImage();
Image.BeginInit();
//Image.StreamSource = ... decoder.Frames[0];
Image.EndInit();
Image.Freeze();
}
...
我需要一些有效的东西来代替上面的评论...
除此之外,您实际上并不需要这种转换(因为您可以在任何使用 BitmapImage 的地方使用 BitmapFrame),您可以直接从字节数组中的编码位图中解码 BitmapImage。
没有必要显式使用 BitmapDecoder。当您将 Stream 分配给 BitmapImage 的 StreamSource
属性 时,框架会自动使用适当的解码器。在创建 BitmapImage 后应立即关闭 Stream 时,您必须注意设置 BitmapCacheOption.OnLoad
。
Image = new BitmapImage();
using (var stream = new MemoryStream(encodedimage))
{
Image.BeginInit();
Image.CacheOption = BitmapCacheOption.OnLoad;
Image.StreamSource = stream;
Image.EndInit();
}
Image.Freeze();