Come creare bitmap dall’array di byte?

Ho cercato tutte le domande sull’array di byte, ma ho sempre fallito. Non ho mai codificato c # sono nuovo in questo lato. Potresti aiutarmi a creare un file immagine dall’array di byte.

Ecco la mia funzione che memorizza il byte nell’array denominato imageData

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

Avrai bisogno di ottenere quei bytes in un MemoryStream :

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

Questo utilizza il sovraccarico del costruttore Bitmap(Stream stream) .

AGGIORNAMENTO: tenere presente che, in base alla documentazione e al codice sorgente che ho letto, verrà generata ArgumentException alle seguenti condizioni:

 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. 

Ragazzi grazie per il vostro aiuto. Penso che tutte queste risposte funzionino. Comunque penso che il mio array di byte contenga byte grezzi. Ecco perché tutte queste soluzioni non hanno funzionato per il mio codice.

Tuttavia ho trovato una soluzione. Forse questa soluzione aiuta altri programmatori che hanno problemi come i miei.

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

Questa soluzione funziona per 8 bit 256 bpp (Format8bppIndexed). Se la tua immagine ha un altro formato devi cambiare PixelFormat .

E c'è un problema con i colors in questo momento. Non appena ho risolto questo, modificherò la mia risposta per gli altri utenti.

* PS = Non sono sicuro del valore del passo ma per 8 bit dovrebbe essere uguale a colonne.

E anche questa funzione funziona per me .. Questa funzione copia un'immagine in scala di grigi a 8 bit in un layout a 32 bit.

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

Può essere facile come:

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

Provarlo:

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