Como criar bitmap a partir da matriz de bytes?

Eu procurei todas as perguntas sobre matriz de bytes, mas eu sempre falhei. Eu nunca codifiquei c # eu sou novo neste lado. Você poderia me ajudar como fazer arquivo de imagem a partir de matriz de bytes.

Aqui está minha function que armazena o byte no array chamado imageData

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

Você precisará obter esses bytes em um MemoryStream :

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

Que usa a sobrecarga do construtor Bitmap(Stream stream) .

ATUALIZAÇÃO: lembre-se de que, de acordo com a documentação e o código-fonte que eu tenho lido, um ArgumentException será lançado nestas condições:

 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. 

Gente obrigado pela sua ajuda. Eu acho que todas essas respostas funcionam. No entanto, acho que minha matriz de bytes contém bytes brutos. É por isso que todas essas soluções não funcionaram para o meu código.

No entanto, encontrei uma solução. Talvez esta solução ajude outros codificadores que têm problemas como o meu.

 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 solução funciona para 8bit 256 bpp (Format8bppIndexed). Se a sua imagem tiver outro formato, você deve alterar o PixelFormat .

E há um problema com as colors agora. Assim que eu resolvi este eu vou editar a minha resposta para outros usuários.

* PS = Não tenho certeza sobre o valor da passada, mas para 8 bits ela deve ser igual a colunas.

E também esta function Works for me .. Esta function copia a imagem em escala de cinza de 8 bits em um layout 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")); } } } } 

Pode ser tão fácil quanto:

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

Testando:

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