El método Image.FromStream () devuelve una excepción de Argumento no válido

Estoy capturando imágenes de una cámara inteligente y recibiendo la matriz de bytes de la cámara a través de la progtwigción del socket (la aplicación .NET es el cliente, la cámara es el servidor).

El problema es que obtengo la excepción System.InvalidArgument en tiempo de ejecución.

private Image byteArrayToImage(byte[] byteArray) { if(byteArray != null) { MemoryStream ms = new MemoryStream(byteArray); return Image.FromStream(ms, false, false); /*last argument is supposed to turn Image data validation off*/ } return null; } 

He buscado este problema en muchos foros y he probado las sugerencias de muchos expertos, pero nada me ha ayudado.

No creo que haya ningún problema con la matriz de bytes como tal porque cuando introduzco la misma matriz de bytes en mi aplicación de cliente VC ++ MFC, obtengo la imagen. Pero esto de alguna manera no funciona en C # .NET.

Alguien puede ayudarme ?

PD:

Otros métodos que he intentado para realizar la misma tarea son:

1.

 private Image byteArrayToImage(byte[] byteArray) { if(byteArray != null) { MemoryStream ms = new MemoryStream(); ms.Write(byteArray, 0, byteArray.Length); ms.Position = 0; return Image.FromStream(ms, false, false); } return null; } 

2.

 private Image byteArrayToImage(byte[] byteArray) { if(byteArray != null) { TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); Bitmap b = (Bitmap)tc.ConvertFrom(byteArray); return b; } return null; } 

Ninguno de los métodos anteriores funcionó. Amablemente ayuda.

Image.FromStream() espera una transmisión que contenga SOLO una imagen!

Restablece la secuencia. Posición en 0. Si tienes una transmisión que contiene varias imágenes u otras cosas, debes leer tus datos de imagen en una matriz de bytes e inicializar un MemoryStream con eso:

Image.FromStream(new MemoryStream(myImageByteArray));

MemoryStream debe permanecer abierto mientras la imagen esté en uso.

Me di cuenta de eso por las malas. 🙂

Tal vez la imagen esté incrustada en un campo OLE y debe tener en cuenta el encabezado OLE de 88 bytes más la carga útil:

 byteBlobData = (Byte[]) reader.GetValue(0); stream = new MemoryStream(byteBlobData, 88, byteBlobData.Length - 88); img = Image.FromStream(stream); 

Supongo que algo va mal cuando recibo el archivo del servidor. ¿Quizás solo consigas parte del archivo antes de intentar convertirlo a una Image ? ¿Estás seguro de que es exactamente la misma matriz de bytes que estás alimentando la aplicación C ++?

Intente guardar la secuencia en un archivo y vea lo que obtiene. Es posible que puedas descubrir algunas pistas allí.

También puede agregar un punto de interrupción y comparar manualmente algunos de los bytes de la matriz de bytes con lo que se supone que son (si lo sabe).


Editar: parece que no hay nada de malo en recibir los datos. El problema es que está en formato sin formato (no es un formato que entienda Image.FromStream ). El constructor Bitmap(Int32, Int32, Int32, PixelFormat, IntPtr) puede ser útil aquí. O bien, puede crear el bitmap en blanco y blt hacerlo manualmente desde los datos sin procesar.

He tenido este problema al hacer esto:

 MemoryStream stream = new MemoryStream(); screenshot.Save(stream, ImageFormat.Png); byte[] bytes = new byte[stream.Length]; stream.Save(bytes, 0, steam.Length); 

Con las últimas 2 líneas siendo el problema. Lo arreglé haciendo esto:

 MemoryStream stream = new MemoryStream(); screenshot.Save(stream, ImageFormat.Png); byte[] bytes = stream.ToArray(); 

Y luego esto funcionó:

 MemoryStream stream = new MemoryStream(bytes); var newImage = System.Drawing.Image.FromStream(stream); stream.Dispose(); 

System.InvalidArgument significa que la transmisión no tiene un formato de imagen válido, es decir, un tipo de imagen que no es compatible.

Prueba esto:

 public Image byteArrayToImage(byte[] item) { Image img=Image.FromStream(new MemoryStream(item)); img.Save(Response.OutputStream, ImageFormat.Gif); return img; } 

¡Espero eso ayude!

He tenido el mismo problema en el pasado y fue causado por una fuga dentro de las bibliotecas de Windows GDI, que es lo que usa ‘Bitmap’. Si esto sucede todo el tiempo para usted, entonces es probable que no esté relacionado, sin embargo.

este código está funcionando

  string query="SELECT * from gym_member where Registration_No ='" + textBox9.Text + "'"; command = new SqlCommand(query,con); ad = new SqlDataAdapter(command); DataTable dt = new DataTable(); ad.Fill(dt); textBox1.Text = dt.Rows[0][1].ToString(); textBox2.Text = dt.Rows[0][2].ToString(); byte[] img = (byte[])dt.Rows[0][18]; MemoryStream ms = new MemoryStream(img); pictureBox1.Image = Image.FromStream(ms); ms.Dispose(); 

Intente utilizar algo similar a lo que se describe aquí https://social.msdn.microsoft.com/Forums/vstudio/en-US/de9ee1c9-16d3-4422-a99f-e863041e4c1d/reading-raw-rgba-data-into- a-bitmap

 Image ImageFromRawBgraArray( byte[] arr, int charWidth, int charHeight, int widthInChars, PixelFormat pixelFormat) { var output = new Bitmap(width, height, pixelFormat); var rect = new Rectangle(0, 0, width, height); var bmpData = output.LockBits(rect, ImageLockMode.ReadWrite, output.PixelFormat); // Row-by-row copy var arrRowLength = width * Image.GetPixelFormatSize(output.PixelFormat) / 8; var ptr = bmpData.Scan0; for (var i = 0; i < height; i++) { Marshal.Copy(arr, i * arrRowLength, ptr, arrRowLength); ptr += bmpData.Stride; } output.UnlockBits(bmpData); return output; }