byte[] to BitmapImage conversion fails

后端 未结 1 838
既然无缘
既然无缘 2021-01-22 07:13

I have a problem. I want to convert BitmapImage into byte[] array and back.

I wrote these methods:

public static byte[] ToByteA         


        
相关标签:
1条回答
  • 2021-01-22 07:46

    There are two problems with your ToByteArray method.

    First it calls BeginInit and EndInit on an already initialized BitmapImage instance. This is not allowed, see the Exceptions list in BeginInit.

    Second, the method could not be called on a BitmapImage that was created from an Uri instead of a Stream. Then the StreamSource property would be null.

    I suggest to implement the method like shown below. This implementation would work for any BitmapSource, not only BitmapImages. And you are able to control the image format by selecting an appropriate BitmapEncoder, e.g. JpegBitmapEncoder instead of 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();
        }
    }
    

    An image buffer returned by this ToByteArray method can always be converted back to a BitmapImage by your ToBitmapImage method.

    And please note that the width and height arguments of your ToBitmapImage method are currently unused.


    UPDATE

    An alternative implementation of the decoding method could look like shown below, although it does not return a BitmapImage but only an instance of the base class BitmapSource. You may however change the return type to 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];
        }
    }
    
    0 讨论(0)
提交回复
热议问题