将位图转换为字节数组
使用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");