Converter um bitmap em uma matriz de bytes

Usando o C #, existe uma maneira melhor de converter um Bitmap Windows em um byte[] que salvar em um arquivo temporário e ler o resultado usando um FileStream ?

Existem algumas maneiras.

ImageConverter

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

Este é conveniente porque não requer muito código.

Fluxo de memory

 public static byte[] ImageToByte2(Image img) { using (var stream = new MemoryStream()) { img.Save(stream, System.Drawing.Imaging.ImageFormat.Png); return stream.ToArray(); } } 

Este é equivalente ao que você está fazendo, exceto que o arquivo é salvo na memory em vez de no disco. Embora mais código, você tem a opção de ImageFormat e pode ser facilmente modificado entre salvar na memory ou no disco.

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

Um MemoryStream pode ser útil para isso. Você poderia colocá-lo em um método de extensão:

 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(); } } } 

Você poderia apenas usá-lo como:

 var image = new Bitmap(10, 10); // Draw your image byte[] arr = image.ToByteArray(ImageFormat.Bmp); 

Eu discordo parcialmente da resposta do prestomanifto em relação ao ImageConverter. Não use o ImageConverter. Não há nada tecnicamente errado com isso, mas simplesmente o fato de usar boxe / unboxing de objects me diz que é um código dos antigos locais escuros do .NET framework e não é ideal para usar com processamento de imagens (é um exagero para converter em um byte [] pelo menos), especialmente quando você considera o seguinte.

Eu dei uma olhada no código ImageConverter usado pelo framework .Net, e internamente ele usa código quase idêntico ao que eu forneci acima. Ele cria um novo MemoryStream , salva o Bitmap em qualquer formato quando você o forneceu e retorna o array. Ignore a sobrecarga extra de criar uma class ImageConverter usando MemoryStream

Você também pode apenas Marshal.Copiar os dados de bitmap. Não há memory intermediária etc. e uma cópia de memory rápida. Isso deve funcionar em bitmaps de 24 bits e de 32 bits.

 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); } } 

.

Salve a imagem em um MemoryStream e, em seguida, pegue a matriz de bytes.

http://msdn.microsoft.com/pt-br/library/ms142148.aspx

  Byte[] data; using (var memoryStream = new MemoryStream()) { image.Save(memoryStream, ImageFormat.Bmp); data = memoryStream.ToArray(); } 

Use um MemoryStream vez de um FileStream , assim:

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

Tente o seguinte:

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

Certifique-se de estar usando:

 System.Drawing & using System.Drawing.Imaging; 

Eu acredito que você pode simplesmente fazer:

 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(); 

Mais simples:

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

Muito simples use isso apenas em uma linha:

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