byte 到BitmapImage转换失败
我有个问题。 我想将BitmapImage
转换为byte[]
数组并返回。
我写了这些方法:
public static byte[] ToByteArray(this BitmapImage bitmapImage) { byte[] bytes; using (MemoryStream ms = new MemoryStream()) { bitmapImage.BeginInit(); bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.StreamSource.CopyTo(ms); bitmapImage.EndInit(); bytes = ms.ToArray(); } return bytes; } public static BitmapImage ToBitmapImage(this byte[] bytes, int width, int height) { BitmapImage bitmapImage = new BitmapImage(); using (MemoryStream ms = new MemoryStream(bytes)) { ms.Position = 0; bitmapImage.BeginInit(); bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.StreamSource = ms; bitmapImage.EndInit(); // HERE'S AN EXCEPTION!!! } return bitmapImage; }
第一个工作正常,但是当我尝试从byte[]
转换为BitmapImage
我得到了一个NotSupportedException
…为什么? 如何更正第二种方法的代码?
ToByteArray
方法有两个问题。
首先,它在已经初始化的BitmapImage实例上调用BeginInit
和EndInit
。 这是不允许的,请参阅BeginInit中的“ 例外”列表。
其次,无法在从Uri而不是Stream创建的BitmapImage上调用该方法。 然后StreamSource
属性将为null
。
我建议实现如下所示的方法。 此实现适用于任何BitmapSource,而不仅适用于BitmapImages。 您可以通过选择适当的BitmapEncoder来控制图像格式,例如JpegBitmapEncoder
而不是PngBitmapEncoder
。
public static byte[] ToByteArray(this BitmapSource bitmap) { var encoder = new PngBitmapEncoder(); // or any other encoder encoder.Frames.Add(BitmapFrame.Create(bitmap)); using (var ms = new MemoryStream()) { encoder.Save(ms); return ms.ToArray(); } }
此ToByteArray
方法返回的图像缓冲区始终可以通过ToBitmapImage
方法转换回BitmapImage。
请注意, ToBitmapImage
方法的width和height参数当前未使用。
UPDATE
解码方法的替代实现可能如下所示,尽管它不返回BitmapImage但只返回基类BitmapSource的实例。 但是,您可以将返回类型更改为BitmapFrame 。
public static BitmapSource ToBitmapImage(this byte[] bytes) { using (var stream = new MemoryStream(bytes)) { var decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); return decoder.Frames[0]; } }