【问题标题】:How to convert Byte[] to BitmapImage如何将 Byte[] 转换为 BitmapImage
【发布时间】:2020-09-30 06:46:57
【问题描述】:

我需要帮助,我有这个方法可以从 Byte[] 中获取 BitmapImage

public BitmapSource ByteToBitmapSource(byte[] image)
{
    BitmapImage imageSource = new BitmapImage();

    using (MemoryStream stream = new MemoryStream(image))
    {
        stream.Seek(0, SeekOrigin.Begin);
        imageSource.BeginInit();
        imageSource.StreamSource = stream;
        imageSource.CacheOption = BitmapCacheOption.OnLoad;
        imageSource.EndInit();
    }

    return imageSource;
}

imageSource.EndInit(); 抛出错误“我们没有找到适合完成此操作的成像组件。”

【问题讨论】:

  • 您要加载的图像是什么格式的?确定支持吗?

标签: c# wpf bitmapimage


【解决方案1】:

Image.Source 设置为 XAML 中的字节数组属性。

<Image x:Name="MyImage" Source="{Binding Path=MyByteArrayProperty}" />

如果你真的想要你可以在代码隐藏中做到这一点:

public void DecodePhoto(byte[] byteVal)
{
  BitmapImage myBitmapImage = new BitmapImage();
  myBitmapImage.BeginInit();
  myBitmapImage.StreamSource = new MemoryStream(byteVal);
  myBitmapImage.DecodePixelWidth = 200;
  myBitmapImage.EndInit();
  MyImage.Source = myBitmapImage;
}

【讨论】:

  • Image.Source 类型为 ImageSource 时,如何将其设置为 byte[]?
【解决方案2】:

您应该向我们提供有关您的图片的更多信息。
我可以假设它不受系统支持,然后我会建议您使用外部工具,例如 imageMagik 或任何其他特定于您的图像的转换器。

【讨论】:

    【解决方案3】:

    我做了类似的东西,但不是用 BitmapImage,希望它可以帮助...

    首先,我从路径中获取图像,所以我得到一个 BMP 并转换为一个字节[]:

    private byte[] LoadImage(string szPathname)
      {
         try
         {
            Bitmap image = new Bitmap(szPathname, true);
    
            MemoryStream ms = new MemoryStream();
            image.Save(ms, ImageFormat.Bmp);
            return ms.ToArray();
         }catch (Exception){...}
    
         return null;
      }
    

    我在我的代码中这样称呼它:

    byte[] bitmapData1 = LoadImage(@"C:\Users\toto\Desktop\test1.bmp");
    

    当我想将 byte[] 转换为 System.Windows.Controls.Image 时,我会这样做:

    protected virtual void OnByteArrayChanged(DependencyPropertyChangedEventArgs e)
      {
         try
         {
            // PropertyChanged method
            BitmapImage bmpi = new BitmapImage();
            bmpi.BeginInit();
            bmpi.StreamSource = new MemoryStream(ByteArray);
            bmpi.EndInit();
    
            System.Windows.Controls.Image image1 = (get my image in my xaml);
            image1.Source = bmpi;
         }catch (Exception){...}
      }
    

    【讨论】:

      【解决方案4】:

      这也可能有帮助:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows;
      using System.Windows.Controls;
      using System.Windows.Data;
      using System.Windows.Documents;
      using System.Windows.Input;
      using System.Windows.Media;
      using System.Windows.Media.Imaging;
      using System.Windows.Navigation;
      using System.Windows.Shapes;
      
      using System.Drawing;
      using System.Runtime.InteropServices;
      using System.IO;
      using System.ComponentModel;
      
      
      public class MakeBitmapSource
      {
          [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory")]
          public static extern void CopyMemory(IntPtr Destination, IntPtr Source, uint Length);
      
      
      
          public static BitmapSource FromNativePointer(IntPtr pData, int w, int h, int ch)
          {
              PixelFormat format = PixelFormats.Default;
      
              if (ch == 1) format = PixelFormats.Gray8; //grey scale image 0-255
              if (ch == 3) format = PixelFormats.Bgr24; //RGB
              if (ch == 4) format = PixelFormats.Bgr32; //RGB + alpha
      
      
              WriteableBitmap wbm = new WriteableBitmap(w, h, 96, 96, format, null);
              CopyMemory(wbm.BackBuffer, pData, (uint)(w * h * ch));
      
              wbm.Lock();
              wbm.AddDirtyRect(new Int32Rect(0, 0, wbm.PixelWidth, wbm.PixelHeight));
              wbm.Unlock();
      
              return wbm;
          }
      
          public static BitmapSource FromArray(byte[] data, int w, int h, int ch)
          {
              PixelFormat format = PixelFormats.Default;
      
              if (ch == 1) format = PixelFormats.Gray8; //grey scale image 0-255
              if (ch == 3) format = PixelFormats.Bgr24; //RGB
              if (ch == 4) format = PixelFormats.Bgr32; //RGB + alpha
      
      
              WriteableBitmap wbm = new WriteableBitmap(w, h, 96, 96, format, null);
              wbm.WritePixels(new Int32Rect(0, 0, w, h), data, ch * w, 0);
      
              return wbm;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-26
        • 1970-01-01
        • 2020-04-12
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        • 1970-01-01
        相关资源
        最近更新 更多