将位图转换为字节数组

使用C#,有没有比保存到临时文件并使用FileStream读取结果更好的方法将Windows Bitmap转换为byte[]

有几个方法。

ImageConverter

 public static byte[] ImageToByte(Image img) { ImageConverter converter = new ImageConverter(); return (byte[])converter.ConvertTo(img, typeof(byte[])); } 

这个很方便,因为它不需要太多的代码。

内存stream

 public static byte[] ImageToByte2(Image img) { using (var stream = new MemoryStream()) { img.Save(stream, System.Drawing.Imaging.ImageFormat.Png); return stream.ToArray(); } } 

这一个相当于你在做什么,除了文件被保存到内存而不是磁盘。 虽然更多的代码,你有select的ImageFormat,它可以很容易地修改保存到内存或磁盘之间。

资料来源: http : //www.vcskicks.com/image-to-byte.php

一个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框架的旧的黑暗的地方的代码,它不理想用于image processing(这是过度的转换为一个字节[]至less),特别是当你考虑以下。

我查看了.Net框架使用的ImageConverter代码,并在内部使用了与上面提供的代码几乎相同的代码。 它创build一个新的MemoryStream ,将它保存在您提供的任何格式的Bitmap中,然后返回该数组。 使用MemoryStream跳过创buildImageConverter类的额外开销

你也可以只是Marshal.Copy位图数据。 没有中间内存stream和一个快速的内存拷贝。 这应该适用于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(); 

尝试以下操作:

 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(); 

更简单:

 return (byte[])System.ComponentModel.TypeDescriptor.GetConverter(pImagen).ConvertTo(pImagen, typeof(byte[])) 

很简单,只用一行就可以了:

 byte[] imgdata = File.ReadAllBytes(@"C:\download.png");