C# 如何将 Byte[] 转换为 BitmapImage

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/8897210/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-09 05:02:41  来源:igfitidea点击:

How to convert Byte[] to BitmapImage

c#wpfbitmapimage

提问by fma3

I need help, I have this method to get a BitmapImage from a Byte[]

我需要帮助,我有这个方法可以从 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();throws an error "We found no imaging component suitable to complete this operation."

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

回答by Shimmy Weitzhandler

You should provide us with more info on your image.
I can assume it's unsupported by the system, which I would then advice you to use an external tool, such as imageMagikor any other converter specific to your image.

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

回答by mlemay

I've made something similar, but it's not with BitmapImage, hopes it can help...

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

First, I get the image from a path, so I get a BMP and cast into a byte[]:

首先,我从路径获取图像,因此我获取 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;
  }

I call this in my code like this:

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

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

And when I want to cast the byte[] into System.Windows.Controls.Image I do this:

当我想将 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){...}
  }

回答by patrick

Set Image.Sourceto a byte array property in XAML.

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

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

If you reallywant you can do it in code behind like this

如果你真的想要,你可以像这样在后面的代码中做到这一点

  public void DecodePhoto(byte[] byteVal)
        {


                MemoryStream strmImg = new MemoryStream(byteVal);
                BitmapImage myBitmapImage = new BitmapImage();
                myBitmapImage.BeginInit();
                myBitmapImage.StreamSource = strmImg;
                myBitmapImage.DecodePixelWidth = 200;
                myBitmapImage.EndInit();
                MyImage.Source = myBitmapImage;

        }

回答by morishuz

This might also help:

这也可能有帮助:

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;
    }
}