create array c# bitmap

c# - array - Convertir un mapa de bits en una matriz de bytes



image c# (10)

Con C #, ¿hay una mejor manera de convertir un Bitmap de Bitmap Windows a un byte[] que guardarlo en un archivo temporal y leer el resultado utilizando FileStream ?


Creo que simplemente puedes hacer:

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



Hay un par de maneras.

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.

Flujo de memoria

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 más código tiene la opción de ImageFormat y se puede modificar fácilmente entre guardar en la memoria o en el disco.

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


Intenta lo siguiente:

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

Asegúrese de que está utilizando:

System.Drawing & using System.Drawing.Imaging;


Más simple:

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


También puede simplemente Marshal.Copy los datos de mapa de bits. Sin flujo de memoria intermedio, 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); } }

.


Un MemoryStream puede ser útil para esto. Podrías 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(); } } }

Puedes usarlo como:

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

Estoy parcialmente en desacuerdo con la respuesta de prestomanifto con respecto al ImageConverter. No utilice ImageConverter. Técnicamente, no hay nada malo en ello, pero el simple hecho de que use el boxeo / desempaquetado del objeto me dice que es el código de los viejos lugares oscuros del marco .NET y que no es ideal para usar con el procesamiento de imágenes (es excesivo para convertir a un byte [] al menos), especialmente cuando consideras lo siguiente.

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


Use un MemoryStream lugar de un FileStream , como esto:

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


Uso muy simple esto solo en una linea:

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


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