C# 如何从几种不同图像格式的字节数组中获取位图图像

C# 如何从几种不同图像格式的字节数组中获取位图图像,c#,wpf,image,C#,Wpf,Image,我使用以下方法将图像转换为不同图像格式的字节数组,从而将图像保存在数据库中: public byte[] foo() { Image img = Image.FromFile(path); var tmpStream = new MemoryStream(); ImageFormat format = img.RawFormat; img.Save(tmpStream, format); tmpStream.Seek(0, SeekOrigin.Begin

我使用以下方法将图像转换为不同图像格式的字节数组,从而将图像保存在数据库中:

public byte[] foo()
{
    Image img = Image.FromFile(path);
    var tmpStream = new MemoryStream();
    ImageFormat format = img.RawFormat;
    img.Save(tmpStream, format);
    tmpStream.Seek(0, SeekOrigin.Begin);
    var imgBytes = new byte[MAX_IMG_SIZE];
    tmpStream.Read(imgBytes, 0, MAX_IMG_SIZE);
    return imgBytes;
}

现在,我需要读取它们并将它们转换回BitmapImage类型,以便向用户显示它们。我正在考虑使用Image.FromStream(Stream)方法,但这似乎没有考虑到不同的图像格式。。。有人知道该怎么做吗?提前感谢。

您不应该在WPF应用程序中使用WinForms
System.Drawing
命名空间中的类(就像您使用
Image.FromFile

WPF提供了自己的一组类来从流和URI加载和保存位图,并内置了自动检测位图帧缓冲区格式的支持

只需直接从流创建
BitmapImage
BitmapFrame

public static BitmapSource BitmaSourceFromByteArray(byte[] buffer)
{
    var bitmap = new BitmapImage();

    using (var stream = new MemoryStream(buffer))
    {
        bitmap.BeginInit();
        bitmap.CacheOption = BitmapCacheOption.OnLoad;
        bitmap.StreamSource = stream;
        bitmap.EndInit();
    }

    bitmap.Freeze(); // optionally make it cross-thread accessible
    return bitmap;
}

这两种方法都返回一个
BitmapSource
,它是BitmapImage和BitmapFrame的基类,应该足以在应用程序的其余部分中处理位图。例如,图像控件的
Source
属性使用另一个基类
ImageSource
作为属性类型

另外,当您从要在加载后关闭的流加载BitmapSource时,必须设置
BitmapCacheOption.OnLoad
。否则,流必须保持打开状态,直到最终显示位图


要对BitmapSource进行编码,应使用以下方法:

public static byte[] BitmapSourceToByteArray(BitmapSource bitmap)
{
    var encoder = new PngBitmapEncoder(); // or any other BitmapEncoder

    encoder.Frames.Add(BitmapFrame.Create(bitmap));

    using (var stream = new MemoryStream())
    {
        encoder.Save(stream);
        return stream.ToArray();
    }
}

您不应该在WPF应用程序中使用WinForms
System.Drawing
命名空间中的类(就像使用
Image.FromFile

WPF提供了自己的一组类来从流和URI加载和保存位图,并内置了自动检测位图帧缓冲区格式的支持

只需直接从流创建
BitmapImage
BitmapFrame

public static BitmapSource BitmaSourceFromByteArray(byte[] buffer)
{
    var bitmap = new BitmapImage();

    using (var stream = new MemoryStream(buffer))
    {
        bitmap.BeginInit();
        bitmap.CacheOption = BitmapCacheOption.OnLoad;
        bitmap.StreamSource = stream;
        bitmap.EndInit();
    }

    bitmap.Freeze(); // optionally make it cross-thread accessible
    return bitmap;
}

这两种方法都返回一个
BitmapSource
,它是BitmapImage和BitmapFrame的基类,应该足以在应用程序的其余部分中处理位图。例如,图像控件的
Source
属性使用另一个基类
ImageSource
作为属性类型

还请注意,从加载后要关闭的流加载位图源时,必须设置
BitmapCacheOption.OnLoad
。否则,流必须保持打开状态,直到最终显示位图


要对BitmapSource进行编码,应使用以下方法:

public static byte[] BitmapSourceToByteArray(BitmapSource bitmap)
{
    var encoder = new PngBitmapEncoder(); // or any other BitmapEncoder

    encoder.Frames.Add(BitmapFrame.Create(bitmap));

    using (var stream = new MemoryStream())
    {
        encoder.Save(stream);
        return stream.ToArray();
    }
}

IIRC,Image.FromStream应自动检测图像格式。您需要根据其格式对其进行任何特殊处理吗?IIRC、Image.FromStream的可能副本应自动检测图像格式。您是否需要根据其格式对其进行任何特殊处理?可能重复