簡體   English   中英

byte[] 到 BitmapImage 的轉換失敗

[英]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 實例上調用BeginInitEndInit 這是不允許的,請參閱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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM