Saltar al contenido

Ocurrió un error genérico en GDI+ en el método Bitmap.Save

Nuestro grupo de trabajo ha pasado mucho tiempo buscando para dar soluciones a tus preguntas, te regalamos la resolución de modo que nuestro deseo es servirte de mucha apoyo.

Solución:

Cuando se construye un objeto de mapa de bits o un objeto de imagen a partir de un archivo, el archivo permanece bloqueado durante la vida útil del objeto. Como resultado, no puede cambiar una imagen y volver a guardarla en el mismo archivo donde se originó. http://support.microsoft.com/?id=814675

Ocurrió un error genérico en GDI+, Imagen JPEG a MemoryStream

Image.Save(..) genera una excepción GDI+ porque el flujo de memoria está cerrado

http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.html

EDITAR:

solo escribo de memoria…

guardar en un flujo de memoria ‘intermediario’, eso debería funcionar

por ejemplo, prueba este – reemplazar

    Bitmap newBitmap = new Bitmap(thumbBMP);
    thumbBMP.Dispose();
    thumbBMP = null;
    newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);

con algo como:

string outputFileName = "...";
using (MemoryStream memory = new MemoryStream())

    using (FileStream fs = new FileStream(outputFileName, FileMode.Create, FileAccess.ReadWrite))
    
        thumbBMP.Save(memory, ImageFormat.Jpeg);
        byte[] bytes = memory.ToArray();
        fs.Write(bytes, 0, bytes.Length);
    

Este mensaje de error se muestra si la ruta que pasa a Bitmap.Save() no es válido (la carpeta no existe, etc.).

    // Once finished with the bitmap objects, we deallocate them.
    originalBMP.Dispose();

    bannerBMP.Dispose();
    oGraphics.Dispose();

Este es un estilo de programación del que te arrepentirás tarde o temprano. Más pronto está llamando a la puerta, se te olvidó uno. no estas desechando nuevoBitmap. Lo que mantiene un bloqueo en el archivo hasta que se ejecuta el recolector de basura. Si no se ejecuta, la segunda vez que intente guardar en el mismo archivo obtendrá el klaboom. Las excepciones de GDI+ son demasiado miserables para dar un buen diagnóstico, por lo que se produce un grave dolor de cabeza. Más allá de las miles de publicaciones googleables que mencionan este error.

Siempre favorecer el uso de la usando declaración. Que nunca se olvida de desechar un objeto, incluso si el código arroja una excepción.

using (var newBitmap = new Bitmap(thumbBMP)) 
    newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);

Aunque no está muy claro por qué incluso crea un nuevo mapa de bits, guardar thumbBMP ya debería ser lo suficientemente bueno. De todos modos, dale al resto de tus objetos desechables lo mismo usando amor.

Comentarios y valoraciones del artículo

Al final de la web puedes encontrar las explicaciones de otros sys admins, tú también tienes la libertad de dejar el tuyo si dominas el tema.

¡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 *