【问题标题】:Windows Phone 8.1 Runtime - Image to byte[] and Vice VersaWindows Phone 8.1 运行时 - 图像到字节 [] 和反之亦然
【发布时间】:2015-12-03 18:23:30
【问题描述】:

对于我的应用程序,我尝试将WriteableBitmap 转换为byte[] 以存储在数据库中,然后从byte[] 转换为BitmapImage 以显示给用户。

到目前为止,我目前的方法没有产生任何结果:

public byte[] ConvertBitmapToByteArray(WriteableBitmap bitmap)
{
    using (Stream stream = bitmap.PixelBuffer.AsStream())
    using (MemoryStream memoryStream = new MemoryStream())
    {
        stream.CopyTo(memoryStream);
        return memoryStream.ToArray();
    }
}

要将字节数组转换为BitmapImage,我使用:

using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream())
{

    using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0)))
    {
        writer.WriteBytes((byte[])buffer);
        writer.StoreAsync().GetResults();
    }


    var image = new BitmapImage();
    image.SetSource(ms);
    imageByteTest.Source = image;
}            

我找到了关于 Silverlight 应用程序的很好的文档,但对于 Windows 应用商店通用运行时应用程序的文档却很少。这些方法哪里出错了?

【问题讨论】:

    标签: windows-runtime windows-phone-8.1 bytearray bitmapimage writeablebitmap


    【解决方案1】:

    您可能想看看 WriteableBitmapEx 库,其中包含对 WriteableBitmap 的一些扩展,以及一些核心功能,例如将 WriteableBitmap 转换为字节数组,反之亦然。

    【讨论】:

      【解决方案2】:

      我为 ByteArrayToBitmapImage 写了一个转换器:

       public object Convert(object value, Type targetType, object parameter, string language)
          {
              var byteArray = value as byte[];
              var bitmapImage = new BitmapImage();
              Window.Current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                  {
                      using (var stream = new MemoryStream(byteArray))
                      {
                          bitmapImage.SetSourceAsync(stream.AsRandomAccessStream());
                      }
                  });
      
              return bitmapImage;
      
          }
      

      和 byte[] -> WriteableBitmap

        public static WriteableBitmap PrepareWritableBitmap(Size size, byte[] pixels)
          {
              uint height = (uint)Math.Floor(size.Height);
              uint width = (uint)Math.Floor(size.Width);
      
              WriteableBitmap bmp = new WriteableBitmap((int)width, (int)height);
              Stream pixStream = bmp.PixelBuffer.AsStream();
              pixStream.Write(pixels, 0, (int)(width * height * 4));
              //4 is a channel number for RGBA, for RGB is 3 channels
              return bmp;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-02
        • 2014-04-16
        • 1970-01-01
        • 2012-03-06
        • 2010-11-10
        • 1970-01-01
        • 2013-03-26
        • 1970-01-01
        相关资源
        最近更新 更多