¿Cómo crear bitmap desde una matriz de bytes?

Busqué todas las preguntas sobre la matriz de bytes pero siempre fallé. Nunca he codificado c # soy nuevo en este lado. ¿Podrían ayudarme a hacer un archivo de imagen desde una matriz de bytes?

Aquí está mi función que almacena bytes en una matriz llamada imageData

 public void imageReady( byte[] imageData, int fWidth, int fHeight)) 

Necesitarás obtener esos bytes en un MemoryStream :

 Bitmap bmp; using (var ms = new MemoryStream(imageData)) { bmp = new Bitmap(ms); } 

Eso usa la sobrecarga del constructor Bitmap(Stream stream) .

ACTUALIZACIÓN: tenga en cuenta que según la documentación y el código fuente que he estado leyendo, se lanzará una ArgumentException sobre estas condiciones:

 stream does not contain image data or is null. -or- stream contains a PNG image file with a single dimension greater than 65,535 pixels. 

Chicos gracias por su ayuda. Creo que todas estas respuestas funcionan. Sin embargo, creo que mi matriz de bytes contiene bytes sin formato. Es por eso que todas esas soluciones no funcionaron para mi código.

Sin embargo, encontré una solución. Tal vez esta solución ayude a otros codificadores que tienen un problema como el mío.

 static byte[] PadLines(byte[] bytes, int rows, int columns) { int currentStride = columns; // 3 int newStride = columns; // 4 byte[] newBytes = new byte[newStride * rows]; for (int i = 0; i < rows; i++) Buffer.BlockCopy(bytes, currentStride * i, newBytes, newStride * i, currentStride); return newBytes; } int columns = imageWidth; int rows = imageHeight; int stride = columns; byte[] newbytes = PadLines(imageData, rows, columns); Bitmap im = new Bitmap(columns, rows, stride, PixelFormat.Format8bppIndexed, Marshal.UnsafeAddrOfPinnedArrayElement(newbytes, 0)); im.Save("C:\\Users\\musa\\Documents\\Hobby\\image21.bmp"); 

Esta solución funciona para 8bit 256 bpp (Format8bppIndexed). Si su imagen tiene otro formato, debe cambiar PixelFormat .

Y hay un problema con los colores en este momento. En cuanto lo resuelva, editaré mi respuesta para otros usuarios.

* PS = No estoy seguro del valor de zancada, pero para 8 bits debería ser igual a columnas.

Y también esta función funciona para mí ... Esta función copia imágenes de escala de grises de 8 bits en un diseño de 32 bits.

 public void SaveBitmap(string fileName, int width, int height, byte[] imageData) { byte[] data = new byte[width * height * 4]; int o = 0; for (int i = 0; i < width * height; i++) { byte value = imageData[i]; data[o++] = value; data[o++] = value; data[o++] = value; data[o++] = 0; } unsafe { fixed (byte* ptr = data) { using (Bitmap image = new Bitmap(width, height, width * 4, PixelFormat.Format32bppRgb, new IntPtr(ptr))) { image.Save(Path.ChangeExtension(fileName, ".jpg")); } } } } 

Puede ser tan fácil como:

 var ms = new MemoryStream(imageData); System.Drawing.Image image = Image.FromStream(ms); image.Save("c:\\image.jpg"); 

Poniéndolo a prueba:

 byte[] imageData; // Create the byte array. var originalImage = Image.FromFile(@"C:\original.jpg"); using (var ms = new MemoryStream()) { originalImage.Save(ms, ImageFormat.Jpeg); imageData = ms.ToArray(); } // Convert back to image. using (var ms = new MemoryStream(imageData)) { Image image = Image.FromStream(ms); image.Save(@"C:\newImage.jpg"); }