2010-11-18 11 views
7

Implementé la siguiente funcionalidad que se conecta al servicio web y descargo un favicon de un sitio determinado y lo guardo en un byte [] que almaceno en nuestro base de datos. Ahora quiero configurarlo para que guarde el icono en el disco. Sin embargo, obtengo un "Parámetro no válido" cuando intento crear la imagen desde el byte [].Crear y guardar una imagen de un byte [] causa El parámetro no es una excepción válida

Mi código es el siguiente ..

stream.Write(imageByteArray, 0, imageByteArray.Length); 
Image i = Image.FromStream(stream); // EXCEPTION HAPPENS HERE. 
i.Save(@"C:\tmp\" + filename + ".ico"); 

La excepción se produce en la línea media.

Este código funciona perfectamente 9 veces de cada diez, pero para algunos favicons, incluso si el icono es una imagen válida (o al menos parece y se muestra en el navegador cuando lo señalan), recibo esta excepción .

¿Alguien tiene alguna idea? ¡Me estoy tirando de los pelos aquí!

Gracias

de Dave

Editar: El valor de la matriz que aparece a tirar el error es 127.

+0

¿Cómo está recopilando estos archivos 'favicon'? ¿Estás seguro de que el archivo siempre existe? ¿Comprueba 'imageByteArray.Length == 0'? – Oded

+0

Sí, estoy seguro de que la matriz no es cero y cuando guardo este icono en el Db, funciona bien. – Dave

Respuesta

20

No hay necesidad de poner en una imagen, escupir los bytes directamente:

var fs = new BinaryWriter(new FileStream(@"C:\\tmp\\" + filename + ".ico", FileMode.Append, FileAccess.Write)); 
fs.Write(imageByteArray); 
fs.Close(); 
+0

Perfecto, realmente estaba pasando demasiado tiempo pensando en la caja. – Dave

+1

Es mejor usar la instrucción 'using' en lugar de abrir y cerrar la transmisión manualmente. – SepehrM

+0

¡¡Respuesta perfecta !! – Rahnzo

0

Añadir formato de imagen:

stream.Position = 0; 
i.Save(@"C:\tmp\" + filename + ".ico", System.Drawing.Imaging.ImageFormat.Icon); 
+0

La excepción arroja la línea antes de eso, desde la línea Image.FromStream (stream); Parece que el valor en la matriz de bytes que explota contiene 127 – Dave

+0

que he actualizado. Es la posición de la corriente. – Aliostad

+0

Lo sentimos, ya hemos intentado esto también y no hace ninguna diferencia. De nuevo, esto parece suceder solo en algunos sitios. ¡Gracias por la ayuda! – Dave

1

Sabía que tenía la respuesta que necesitaba, pero solo quiero seguir con su idea original. Creo que el problema es su matriz de bytes de alguna manera había sido cambiado y convertido en matriz de caracteres de bytes, sólo tiene que añadir este código para hacer que se convierta matriz de bytes de nuevo:

for (int i=0;i<imageByteArray.Length;i++) 
{ 
    imageByteArray[i]=(byte) imageByteArray[i]; 
} 

tuve este problema y lo resolvió por esta solución . ¡Buena suerte!

Cuestiones relacionadas