Преобразовать растровое изображение в байтовый массив - PullRequest
210 голосов
/ 08 сентября 2011

Используя C #, есть ли лучший способ преобразовать Windows Bitmap в byte[], чем сохранить во временный файл и прочитать результат, используя FileStream?

Ответы [ 10 ]

376 голосов
/ 08 сентября 2011

Есть несколько способов.

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

84 голосов
/ 08 сентября 2011

A 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, и он не идеален для использования.с обработкой изображений (по крайней мере, излишне конвертировать в байт []), особенно если учесть следующее.

Я посмотрел на код ImageConverter, используемый в среде .Net, и внутреннеиспользует код, практически идентичный приведенному выше.Он создает новый MemoryStream, сохраняет Bitmap в любом формате, в котором он был, когда вы его предоставили, и возвращает массив.Пропустите дополнительные затраты на создание класса ImageConverter, используя MemoryStream

41 голосов
/ 22 июня 2013

Вы также можете просто Marshal.Copy данных растрового изображения.Нет промежуточного потока памяти и т. Д. И быстрая копия памяти.Это должно работать как для 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 голосов
/ 08 сентября 2011

Сохраните изображение в 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();
  }
9 голосов
/ 08 сентября 2011

Используйте MemoryStream вместо FileStream, например:

MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();
7 голосов
/ 08 сентября 2011

Попробуйте следующее:

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

byte[] byteArray = stream.GetBuffer();

Убедитесь, что вы используете:

System.Drawing & using System.Drawing.Imaging;
6 голосов
/ 08 сентября 2011

Я полагаю, вы можете просто сделать:

ImageConverter converter = new ImageConverter();
var bytes = (byte[])converter.ConvertTo(img, typeof(byte[]));
5 голосов
/ 08 сентября 2011
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
4 голосов
/ 22 октября 2014

Более просто:

return (byte[])System.ComponentModel.TypeDescriptor.GetConverter(pImagen).ConvertTo(pImagen, typeof(byte[]))
0 голосов
/ 20 августа 2015

Очень просто использовать это только в одной строке:

byte[] imgdata = File.ReadAllBytes(@"C:\download.png");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...