将位图转换为字节数组

使用c#,是否有更好的方法将Windows Bitmap转换为byte[],而不是保存到临时文件并使用FileStream读取结果?

461041 次浏览

将图像保存到MemoryStream,然后获取字节数组。

http://msdn.microsoft.com/en-us/library/ms142148.aspx < a href = " http://msdn.microsoft.com/en-us/library/ms142148.aspx " > < / >

  Byte[] data;


using (var memoryStream = new MemoryStream())
{
image.Save(memoryStream, ImageFormat.Bmp);


data = memoryStream.ToArray();
}

我相信你可以简单地做到:

ImageConverter converter = new ImageConverter();
var bytes = (byte[])converter.ConvertTo(img, typeof(byte[]));

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。它在技术上没有什么问题,但简单的事实是,它使用装箱/拆箱from object告诉我它的代码来自。net框架的旧黑暗的地方,它不理想用于图像处理(它是过度转换到字节[]至少),特别是当你考虑以下。

我看了一下。net框架使用的ImageConverter代码,在内部它使用的代码几乎与我上面提供的相同。它创建一个新的MemoryStream,以你提供时的格式保存Bitmap,并返回数组。跳过使用MemoryStream创建ImageConverter类的额外开销

使用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;
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();

有几种方法。

ImageConverter

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的选项,它可以很容易地修改保存到内存或磁盘之间。

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

你也可以只是元帅。复制位图数据。没有中间内存流等和一个快速的内存拷贝。这应该适用于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);
}


}

更简单:

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

非常简单,只需在一行中使用:

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