首页 文章

将位图转换为字节数组

提问于
浏览
193

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

10 回答

  • 38

    有几种方法 .

    ImageConverter

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

    这个很方便,因为它不需要很多代码 .

    Memory Stream

    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

  • 5

    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 类的额外开销

  • 343

    你也可以只是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);
        }
    
    }
    

    .

  • 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

    使用 MemoryStream 而不是 FileStream ,如下所示:

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

    请尝试以下方法:

    MemoryStream stream = new MemoryStream();
    Bitmap bitmap = new Bitmap();
    bitmap.Save(stream, ImageFormat.Jpeg);
    
    byte[] byteArray = stream.GetBuffer();
    

    确保您使用的是:

    System.Drawing & using System.Drawing.Imaging;
    
  • 83

    我相信你可能会这样做:

    ImageConverter converter = new ImageConverter();
    var bytes = (byte[])converter.ConvertTo(img, typeof(byte[]));
    
  • 7
    MemoryStream ms = new MemoryStream();
    yourBitmap.Save(ms, ImageFormat.Bmp);
    byte[] bitmapData = ms.ToArray();
    
  • 9

    更简单:

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

    非常简单,只需一行即可使用:

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

相关问题