2012-01-31 75 views
14

Estoy intentando guardar una imagen en MemoryStream pero está fallando bajo ciertas condiciones.Image.Save crashing: {"El valor no puede ser nulo. R nNombre del parámetro: encoder"}

Aquí está el código:

El siguiente código tiene éxito:

Image img = Bitmap.FromStream(fileStream); 
MemoryStream ms = new MemoryStream(); 
img.Save(ms, img.RawFormat); // This succeeds. 

El siguiente código falla:

Image img = Bitmap.FromStream(fileStream); 
Image thumb = img.GetThumbnailImage(thumbWidth, thumbHeight, null, System.IntPtr.Zero); 

MemoryStream ms = new MemoryStream(); 
thumb.Save(ms, thumb.RawFormat); // This fails. 

en cuenta que el segundo fragmento está utilizando una imagen creada usando Image.GetThumbnailImage.

¿Cuál es la diferencia? ¿Alguien tiene alguna idea de por qué está fallando?

Respuesta

22

creo que el problema tiene que ver con esta parte de la GetThumbnailImage documentation:

Si el Image contiene una imagen en miniatura incorporado, este método recupera la miniatura incorporado y lo escala al tamaño solicitado. Si el Image no contiene una imagen en miniatura incrustada, este método crea una imagen en miniatura escalando la imagen principal.

Esto probablemente explique el comportamiento intermitente (AKA "ciertas condiciones"). La explicación está en el siguiente Microsoft Connect ticket:

La API subyacente no puede ubicar un codificador para el tipo de imagen MemoryBmp. Tendremos que investigar esto será el equipo de GDI +. Mientras tanto, deberías poder cambiar tu ImageFormat a ImageFormat.Bmp en lugar de ImageFormat.MemoryBmp y debería funcionar. Todavía se guardará en el MemoryStream usando el formato BMP.

Con toda probabilidad, si no hay una miniatura incrustado, la nueva miniatura generada por la API GetThumbnailImage es, de hecho, va a tener un RawFormat de MemoryBmp que no tiene un codificador asociado - por lo tanto el mensaje de error específico que se está viendo .

Simplemente no use thumb.RawFormat; ya que sabes que es un mapa de bits de todos modos, usa ImageFormat.Bmp en su lugar.

P.S. Tenga en cuenta que, aunque eliminé mi respuesta anterior porque resultó no ser relevante para este problema en particular, sigue siendo importante utilizar la API GetThumbnailImage de manera adecuada, como lo especifica la documentación; usted debe pasar un delegado válido para el parámetro callback en lugar de null, de lo contrario, puede fallar, y usted todavía necesita envolver desechables en using cláusulas.

+1

cambiando 'thumb.Save (ms, thumb.RawFormat)' a 'thumb.Save (ms, thumb.Bmp)' lo hizo! – agarcian

Cuestiones relacionadas