2011-03-12 95 views
7

Estoy intentando convertir un byte[] en Bitmap en C#. Lo que sigue es el código:El parámetro no es un error válido al crear una imagen desde el byte [] en C#

MemoryStream ms = new MemoryStream(b); 
Bitmap bmp = new Bitmap(ms); 

Se muestra el error al crear el Parameter is not validBitmap.

byte[] b viene de una corriente de red.

Pero cuando escribo este byte [] en un archivo, y abro este archivo en cualquier visor de imágenes simplemente funciona perfectamente. A continuación se muestra el código para escribir el byte [] en el archivo:

var fs = new BinaryWriter(new FileStream("tmp.bmp", FileMode.Create, FileAccess.Write)); 
fs.Write(b); 
fs.Close(); 

¿Qué me falta aquí?

EDITAR

Aquí está mi código completo que estaba causando un problema

Socket s = listener.AcceptSocket(); 
byte[] b = new byte[imgLen]; 
s.Receive(b); 
MemoryStream ms = new MemoryStream(b); 
// now here I am using ms.Seek(0, SeekOrigin.Begin); that fixed my problem. 
Bitmap bmp = new Bitmap(ms); 
pictureBox1.Image = bmp; 
s.Close(); 

estoy utilizando este código en evento y no hay nada extra. Solo intento mostrar una imagen que se transmite por la red. El servidor está escrito en Java que está transmitiendo esta imagen.

Espero que aclare las dudas.

Gracias

+0

¿Ha intentado utilizar Image.FromStream en su lugar? No puedo pensar en por qué podría funcionar, pero vale la pena intentarlo ... –

+1

Probé Image.FromStream pero eso tampoco funcionó. –

+0

@Jon. Es demasiado tarde. ¡Jon, Darin te tiene esta semana! –

Respuesta

5

intentar restablecer la ubicación actual en la corriente

MemoryStream ms = new MemoryStream(b); 
ms.Seek(0, SeekOrigin.Begin); 
Bitmap bmp = new Bitmap(ms); 
+0

Eso fue lo primero que pensé, pero no es necesario cuando construyes un MemoryStream directamente desde una matriz de bytes. –

+0

¡Gracias! Estaba estirando la cabeza de las últimas 2 horas y busqué con Google también pero no encontré ninguna solución. ¡Eres gran hombre! Gracias de nuevo :) –

+0

Entonces, aparentemente, había una necesidad después de todo, o había un código involucrado que no vimos;). – Abel

0

Trate de esta manera:

byte[] b = ... 
using (var ms = new MemoryStream(b)) 
using (var bmp = Image.FromStream(ms)) 
{ 
    // do something with the bitmap 
} 
+0

Primero usaría Image.FromStream en lugar de Bitmap.FromStream (como está definido en Imagen, no Bitmap) y en segundo lugar no puedo ver cómo afectará eso al * constructor * funcionando o no. –

+2

¡Esto también me da el mismo error! –

+0

@Vinod Maurya, acabo de probar este código con 'b = File.ReadAllBytes (" test.png ");' y se cargó correctamente en el mapa de bits. @Jon, tienes razón sobre 'Image'. –

13

bien, sólo para aclarar las cosas un poco ... el problema es que new Bitmap(ms) va a leer los datos de la posición actual de la secuencia, si la secuencia se encuentra actualmente en el final de los datos, no podrá leer nada, de ahí el problema.

La pregunta afirma que el código es el siguiente:

MemoryStream ms = new MemoryStream(b); 
Bitmap bmp = new Bitmap(ms); 

En ese caso no hay ninguna requisito para restablecer la posición de la corriente, ya que será ya 0. Sin embargo, sospecho que el código es realidad de la misma familia:

MemoryStream ms = new MemoryStream(); 
// Copy data into ms here, e.g. reading from NetworkStream 
Bitmap bmp = new Bitmap(ms); 

o posiblemente:

MemoryStream ms = new MemoryStream(b); 
// Other code which *reads* from ms, which will change its position, 
// before we finally call the constructor: 
Bitmap bmp = new Bitmap(ms); 

En este caso hace tendrá que restablecer la posición, porque de lo contrario el "cursor" de la secuencia se encuentra en el final de los datos en lugar del inicio.Sin embargo, personalmente prefiero utilizar la propiedad Position en lugar del método Seek, sólo por simplicidad, por lo que haría uso:

MemoryStream ms = new MemoryStream(); 
// Copy data into ms here, e.g. reading from NetworkStream 

// Rewind the stream ready for reading 
ms.Position = 0; 
Bitmap bmp = new Bitmap(ms); 

Es sólo sirve para demostrar lo importante que es que el código de ejemplo de una pregunta es representante del código real código ...

+0

Estoy usando 'MemoryStream ms = new MemoryStream (b);' para crear una secuencia de memoria! –

+0

@Vinod: Entonces debe estar haciendo * algo * else antes de llamar al constructor Bitmap ... porque la posición inicial de una secuencia construida de esa manera * es 0 *. Si pudieras publicar el código * completo * involucrado, podríamos ayudarte aún más ... pero no creo que estés creando 'MemoryStream' para una matriz de bytes y luego llamas inmediatamente a' nuevo Bitmap (ms) '. Si lo fueras, rebobinar simplemente * no ayudaría *. –

+0

escribe '// Otro código que * lee * de ms, que cambiará su posición'. No sería la primera vez que veo a la gente depurando paso a paso, pasando el mouse, invocando getters, invocando efectos secundarios. O use la ventana Inmediato. Este es un ejemplo perfecto en el que los efectos secundarios pueden causar un comportamiento que solo funciona (arroja) en un entorno de depuración. – Abel

Cuestiones relacionadas