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的可能副本应自动检测图像格式。您是否需要根据其格式对其进行任何特殊处理?可能重复