Saltar al contenido

Imagen gif de C# a MemoryStream y viceversa (perder animación)

Puede que se de el caso de que encuentres algún fallo en tu código o proyecto, recuerda probar siempre en un ambiente de testing antes subir el código al proyecto final.

Solución:

Cuando cargas tu imagen desde un Stream, .NET Framework detecta que el GIF está animado. Como sabe que no podrá volver a codificar un GIF animado, intenta almacenar la codificación original del GIF. pero esto sucede después ha leído la transmisión y decodificado el GIF. Entonces, cuando intenta rebobinar la transmisión, falla y termina sin almacenar el original.

Cuando usted llama Save() primero verifica si tiene almacenada la codificación original. Pero como esa operación falló, intenta volver a codificar el GIF. Dado que .NET no tiene un codificador para GIF animados, solo codifica el primer cuadro.

Si usas un FileStream en cambio, funciona, ya que un FileStream es buscable.

Puede hacer que su código funcione cargando primero la respuesta en un MemoryStream:

// ...
Stream stream = httpWebReponse.GetResponseStream();

MemoryStream memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
memoryStream.Position = 0;
stream = memoryStream;

Image img = Image.FromStream(stream);
// ...

Si desea ver lo que sucede, habilite la depuración de la fuente de referencia de .NET y observe lo que sucede en Image.EnsureSave(). También notará que la implementación de la imagen ya copia el Stream en un MemoryStream, por lo que podrían solucionar el problema al usar eso en lugar del Stream original.

GDI+ no contiene ningún GIF animado codificador (solo un descifrador). Entonces tus img.Guardar soltará la animación. Pero podría probar esto: http://www.codeproject.com/KB/GDI-plus/NGif.aspx

Nos puedes añadir valor a nuestro contenido informacional contribuyendo tu experiencia en las críticas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *