我的byte []错误到WPF BitmapImage转换?

时间:2010-10-08 00:15:50

标签: wpf bytearray byte bitmapimage

我将BitmapImage保存到byte []以保存在DB中。我非常确定数据是否被准确保存和检索,所以这不是问题。

在我的byte []到BitmapImage转换时,我不断收到“System.NotSupportedException异常:找不到适合完成此操作的映像组件。”

任何人都可以在这里看到我的两个功能有什么问题吗?

  private Byte[] convertBitmapImageToBytestream(BitmapImage bi)
  {
     int height = bi.PixelHeight;
     int width = bi.PixelWidth;
     int stride = width * ((bi.Format.BitsPerPixel + 7) / 8);

     Byte[] bits = new Byte[height * stride];
     bi.CopyPixels(bits, stride, 0);

     return bits;
  }

  public BitmapImage convertByteToBitmapImage(Byte[] bytes)
  {
     MemoryStream stream = new MemoryStream(bytes);
     stream.Position = 0;
     BitmapImage bi = new BitmapImage();
     bi.BeginInit();
     bi.StreamSource = stream;
     bi.EndInit();
     return bi;
  }

3 个答案:

答案 0 :(得分:0)

这个StackOverflow问题有帮助吗?

byte[] to BitmapImage in silverlight

编辑:

试试这个,不确定它是否会起作用:

public BitmapImage convertByteToBitmapImage(Byte[] bytes)
{
    MemoryStream stream = new MemoryStream(bytes);
    stream.Position = 0;
    BitmapImage bi = new BitmapImage();
    bi.BeginInit();
    bi.CacheOption = BitmapCacheOption.OnLoad;
    bi.DecodePixelWidth = ??; // Width of the image
    bi.StreamSource = stream;
    bi.EndInit();
    return bi;
}

更新2:

我找到了这些:

Load a byte[] into an Image at Runtime

BitmapImage from byte[] on a non UIThread

除此之外,我不知道。

答案 1 :(得分:0)

您如何知道您创建的byte []格式是BI在Stream中所期望的?为什么不使用BitmapImage.StreamSource来创建保存的byte []?然后你知道格式是兼容的。

http://www.codeproject.com/KB/vb/BmpImage2ByteArray.aspx

http://social.msdn.microsoft.com/forums/en-US/wpf/thread/8327dd31-2db1-4daa-a81c-aff60b63fee6/

[我没有尝试任何此代码,但你可以]

答案 2 :(得分:0)

原来的bitmapimage CopyPixels不对。我获取bitmapimage的输出并将其转换为可用于本例jpg的东西。

public static Byte[] convertBitmapImageToBytestream(BitmapImage bi)
  {
     MemoryStream memStream = new MemoryStream();
     JpegBitmapEncoder encoder = new JpegBitmapEncoder();
     encoder.Frames.Add(BitmapFrame.Create(bi));
     encoder.Save(memStream);
     byte[] bytestream = memStream.GetBuffer();
     return bytestream;
  }