将位图转换为字节数组

时间:2011-09-08 15:34:33

标签: c# bitmap

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

10 个答案:

答案 0 :(得分:370)

有几种方法。

<强> 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

答案 1 :(得分:84)

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,并返回该数组。使用ImageConverter

省略创建MemoryStream课程的额外开销

答案 2 :(得分:39)

你也可以只是Marshal。复制位图数据。没有中间存储器流等和快速存储器副本。这应该适用于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);
    }

}

答案 3 :(得分:15)

将图像保存到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();
  }

答案 4 :(得分:9)

使用MemoryStream代替FileStream,如下所示:

MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();

答案 5 :(得分:7)

尝试以下方法:

MemoryStream stream = new MemoryStream();
Bitmap bitmap = new Bitmap();
bitmap.Save(stream, ImageFormat.Jpeg);

byte[] byteArray = stream.GetBuffer();

确保您正在使用:

System.Drawing & using System.Drawing.Imaging;

答案 6 :(得分:6)

我相信你可以这样做:

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

答案 7 :(得分:5)

MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();

答案 8 :(得分:4)

更简单:

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

答案 9 :(得分:-2)

非常简单地在一行中使用它:

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