Convierte un bitmap en una matriz de bytes

Usando C #, ¿hay una mejor manera de convertir un Bitmap Windows en un byte[] que guardar en un archivo temporal y leer el resultado usando un FileStream ?

Hay un par de formas.

ImageConverter

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

Este es conveniente porque no requiere mucho código.

Memory Stream

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

Este es equivalente a lo que está haciendo, excepto que el archivo se guarda en la memoria en lugar de en el disco. Aunque hay más código, tiene la opción de ImageFormat y se puede modificar fácilmente entre guardar en la memoria o el disco.

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

Un MemoryStream puede ser útil para esto. Podría ponerlo en un método de extensión:

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

Podrías usarlo así:

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

Estoy parcialmente en desacuerdo con la respuesta de prestmanifto con respecto al ImageConverter. No use ImageConverter. No hay nada técnicamente incorrecto con esto, pero el simple hecho de que usa el boxeo / unboxing del objeto me dice que es código de los viejos lugares oscuros del framework .NET y no es ideal para usar con el procesamiento de imágenes (es excesivo convertirlo a un byte) [] al menos), especialmente cuando considera lo siguiente.

ImageConverter un vistazo al código de ImageConverter utilizado por .Net framework, e internamente usa un código casi idéntico al que proporcioné arriba. Crea un nuevo MemoryStream , guarda el Bitmap de Bitmap en el formato en el que estaba cuando lo proporcionó y devuelve el conjunto. Omita la sobrecarga adicional de crear una clase ImageConverter usando MemoryStream

También puede usar Marshal. Copie los datos del bitmap. No hay flujo de memoria intermediario, etc. y una copia de memoria rápida. Esto debería funcionar tanto en mapas de bits de 24 bits como 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); } } 

.

Guarde la imagen en un MemoryStream y luego tome la matriz de bytes.

http://msdn.microsoft.com/en-us/library/ms142148.aspx

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

Use un MemoryStream lugar de un FileStream , como este:

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

Pruebe lo siguiente:

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

Asegúrate de estar usando:

 System.Drawing & using System.Drawing.Imaging; 

Creo que simplemente puedes:

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

Más simple:

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

Muy simple usa esto solo en una línea:

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