[英]byte[] to BitmapImage conversion fails
我有個問題。 我想將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
方法的寬度和高度參數當前未使用。
更新
解碼方法的另一種實現可能如下所示,盡管它不返回 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];
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.