[英]Convert a bitmap into a byte array
使用 C#,是否有比保存到临时文件并使用FileStream
读取结果更好的方法将 Windows Bitmap
转换为byte[]
?
有几种方法。
图像转换器
public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
这个很方便,因为它不需要很多代码。
内存流
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}
这与您正在执行的操作相同,只是将文件保存到内存而不是磁盘。 虽然更多的代码您可以选择 ImageFormat 并且可以在保存到内存或磁盘之间轻松修改。
MemoryStream可以对此有所帮助。 你可以把它放在一个扩展方法中:
public static class ImageExtensions
{
public static byte[] ToByteArray(this Image image, ImageFormat format)
{
using(MemoryStream ms = new MemoryStream())
{
image.Save(ms, format);
return ms.ToArray();
}
}
}
你可以像这样使用它:
var image = new Bitmap(10, 10);
// Draw your image
byte[] arr = image.ToByteArray(ImageFormat.Bmp);
我部分不同意 prestomanifto 关于 ImageConverter 的回答。 不要使用 ImageConverter。 它在技术上没有任何问题,但它使用对象的装箱/拆箱这一事实告诉我它是来自 .NET 框架的旧黑暗地方的代码,并且它不适合用于图像处理(转换为字节是过度的[] 至少),尤其是当您考虑以下内容时。
我查看了 .Net 框架使用的ImageConverter
代码,它在内部使用的代码几乎与我上面提供的代码相同。 它创建一个新的MemoryStream
,以您提供它时的任何格式保存Bitmap
,并返回数组。 跳过使用MemoryStream
创建ImageConverter
类的额外开销
您也可以仅 Marshal.Copy 位图数据。 没有中间内存流等和快速的内存复制。 这应该适用于 24 位和 32 位位图。
public static byte[] BitmapToByteArray(Bitmap bitmap)
{
BitmapData bmpdata = null;
try
{
bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
int numbytes = bmpdata.Stride * bitmap.Height;
byte[] bytedata = new byte[numbytes];
IntPtr ptr = bmpdata.Scan0;
Marshal.Copy(ptr, bytedata, 0, numbytes);
return bytedata;
}
finally
{
if (bmpdata != null)
bitmap.UnlockBits(bmpdata);
}
}
.
将图像保存到 MemoryStream 中,然后获取字节数组。
http://msdn.microsoft.com/en-us/library/ms142148.aspx
Byte[] data;
using (var memoryStream = new MemoryStream())
{
image.Save(memoryStream, ImageFormat.Bmp);
data = memoryStream.ToArray();
}
使用MemoryStream
而不是FileStream
,如下所示:
MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();
更简单:
return (byte[])System.ComponentModel.TypeDescriptor.GetConverter(pImagen).ConvertTo(pImagen, typeof(byte[]))
请尝试以下操作:
MemoryStream stream = new MemoryStream();
Bitmap bitmap = new Bitmap();
bitmap.Save(stream, ImageFormat.Jpeg);
byte[] byteArray = stream.GetBuffer();
确保您正在使用:
System.Drawing & using System.Drawing.Imaging;
我相信你可以简单地做:
ImageConverter converter = new ImageConverter();
var bytes = (byte[])converter.ConvertTo(img, typeof(byte[]));
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
非常简单地在一行中使用它:
byte[] imgdata = File.ReadAllBytes(@"C:\download.png");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.