Se produjo un error genérico en GDI + en el método Bitmap.Save

Estoy trabajando para cargar y guardar una copia en miniatura de esa imagen en una carpeta de miniaturas.

Estoy usando el siguiente enlace:

http://weblogs.asp.net/markmcdonnell/archive/2008/03/09/resize-image-before-uploading-to-server.aspx

pero

newBMP.Save(directory + "tn_" + filename); 

está causando la excepción “Ocurrió un error genérico en GDI +”.

He intentado dar permiso en la carpeta, también intenté usar un nuevo objeto bmp por separado al guardar.

Editar:

  protected void ResizeAndSave(PropBannerImage objPropBannerImage) { // Create a bitmap of the content of the fileUpload control in memory Bitmap originalBMP = new Bitmap(fuImage.FileContent); // Calculate the new image dimensions int origWidth = originalBMP.Width; int origHeight = originalBMP.Height; int sngRatio = origWidth / origHeight; int thumbWidth = 100; int thumbHeight = thumbWidth / sngRatio; int bannerWidth = 100; int bannerHeight = bannerWidth / sngRatio; // Create a new bitmap which will hold the previous resized bitmap Bitmap thumbBMP = new Bitmap(originalBMP, thumbWidth, thumbHeight); Bitmap bannerBMP = new Bitmap(originalBMP, bannerWidth, bannerHeight); // Create a graphic based on the new bitmap Graphics oGraphics = Graphics.FromImage(thumbBMP); // Set the properties for the new graphic file oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic; // Draw the new graphic based on the resized bitmap oGraphics.DrawImage(originalBMP, 0, 0, thumbWidth, thumbHeight); Bitmap newBitmap = new Bitmap(thumbBMP); thumbBMP.Dispose(); thumbBMP = null; // Save the new graphic file to the server newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg); oGraphics = Graphics.FromImage(bannerBMP); // Set the properties for the new graphic file oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic; // Draw the new graphic based on the resized bitmap oGraphics.DrawImage(originalBMP, 0, 0, bannerWidth, bannerHeight); // Save the new graphic file to the server bannerBMP.Save("~/image/" + objPropBannerImage.ImageId + ".jpg"); // Once finished with the bitmap objects, we deallocate them. originalBMP.Dispose(); bannerBMP.Dispose(); oGraphics.Dispose(); } 

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

Se produjo un error genérico en GDI +, JPEG Image to MemoryStream

Image.Save (..) arroja una excepción GDI + porque la secuencia de memoria está cerrada

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

EDITAR:
solo escribiendo de memoria …

guardar en una secuencia de memoria ‘intermediaria’, eso debería funcionar

por ejemplo, intente esto – reemplace

  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 también se muestra si la ruta que pasa a Bitmap.Save() no es válida (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 progtwigción del que te arrepentirás tarde o temprano. Más pronto está llamando a la puerta, se olvidó de uno. No está eliminando newBitmap . Que mantiene un locking en el archivo hasta que se ejecute el recolector de elementos no utilizados. Si no se ejecuta, entonces la segunda vez que intenta guardar en el mismo archivo obtendrá el klaboom. Las excepciones de GDI + son demasiado miserables para proporcionar un buen diagnóstico, por lo que se producen graves arañazos en la cabeza. Más allá de los miles de publicaciones que mencionan este error.

Siempre favorece el uso de la statement de uso . Que nunca se olvida de disponer de 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 creas un nuevo bitmap, guardar thumbBMP ya debería ser lo suficientemente bueno. De todos modos, dale al rest de tus objetos desechables el mismo amor.

Verifique el permiso de su carpeta donde se guarda la imagen. Haga clic en la carpeta y luego vaya a:

Propiedades> Seguridad> Editar> Agregar– seleccione “todos” y marque Permitir “Control total”

En mi caso, el archivo de imagen de bitmap ya existía en la unidad del sistema , por lo que mi aplicación arrojó el error “Se produjo un error genérico en GDI +” .

  1. Verificar que exista la carpeta de destino
  2. Verifique que no haya un archivo con el mismo nombre en la carpeta de destino

Estaba enfrentando el mismo problema. Ocurrió un error genérico en GDI + al guardar mientras trabajaba en la aplicación MVC, estaba recibiendo este error porque estaba escribiendo una ruta incorrecta para guardar la imagen, corregí la ruta de guardado y funcionó bien para mí.

 img1.Save(Server.MapPath("/Upload/test.png", System.Drawing.Imaging.ImageFormat.Png); 

Siempre controlo / pruebo estos:

  • ¿La ruta + nombre de archivo contiene caracteres ilegales para el sistema de archivos dado?
  • ¿El archivo ya existe? (Malo)
  • ¿El camino ya existe? (Bueno)
  • Si la ruta es relativa: ¿lo espero en el directorio principal correcto (principalmente bin/Debug ;-))?
  • ¿Es la ruta de acceso editable para el progtwig y como qué usuario se ejecuta? (¡Los servicios pueden ser complicados aquí!)
  • ¿El camino completo realmente no contiene caracteres ilegales? (algunos caracteres Unicode son casi invisibles)

Nunca tuve ningún problema con Bitmap.Save() aparte de esta lista.

Lo hice funcionar usando FileStream, obtengo ayuda de estos
http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.html http://csharpdotnetfreak.blogspot.com/2010/02/resize-image-upload-ms-sql -database.html

 System.Drawing.Image imageToBeResized = System.Drawing.Image.FromStream(fuImage.PostedFile.InputStream); int imageHeight = imageToBeResized.Height; int imageWidth = imageToBeResized.Width; int maxHeight = 240; int maxWidth = 320; imageHeight = (imageHeight * maxWidth) / imageWidth; imageWidth = maxWidth; if (imageHeight > maxHeight) { imageWidth = (imageWidth * maxHeight) / imageHeight; imageHeight = maxHeight; } Bitmap bitmap = new Bitmap(imageToBeResized, imageWidth, imageHeight); System.IO.MemoryStream stream = new MemoryStream(); bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); stream.Position = 0; byte[] image = new byte[stream.Length + 1]; stream.Read(image, 0, image.Length); System.IO.FileStream fs = new System.IO.FileStream(Server.MapPath("~/image/a.jpg"), System.IO.FileMode.Create , System.IO.FileAccess.ReadWrite); fs.Write(image, 0, image.Length); 

Crear imagen de ruta de carpeta / pulgares en su disco duro => ¡Problema resuelto!

Para mí fue un problema de permiso. Alguien eliminó los permisos de escritura en la carpeta de la cuenta de usuario bajo la cual se estaba ejecutando la aplicación.

  I used below logic while saving a .png format. This is to ensure the file is already existing or not.. if exist then saving it by adding 1 in the filename Bitmap btImage = new Bitmap("D:\\Oldfoldername\\filename.png"); string path="D:\\Newfoldername\\filename.png"; int Count=0; if (System.IO.File.Exists(path)) { do { path = "D:\\Newfoldername\\filename"+"_"+ ++Count + ".png"; } while (System.IO.File.Exists(path)); } btImage.Save(path, System.Drawing.Imaging.ImageFormat.Png); 

Encontré este error al intentar convertir imágenes de Tiff a Jpeg. Para mí, el problema se debió a que las dimensiones del tiff eran demasiado grandes. Cualquier cosa hasta alrededor de 62000 píxeles estaba bien, cualquier cosa por encima de este tamaño produjo el error.

para mí fue un problema de ruta al guardar la imagen.

 int count = Directory.EnumerateFiles(System.Web.HttpContext.Current.Server.MapPath("~/images/savedimages"), "*").Count(); var img = Base64ToImage(imgRaw); string path = "images/savedimages/upImages" + (count + 1) + ".png"; img.Save(Path.Combine(System.Web.HttpContext.Current.Server.MapPath(path))); return path; 

Así que lo arreglé agregando la siguiente barra inclinada

 String path = "images/savedimages.... 

debiera ser

 String path = "/images/savedimages.... 

Espero que ayude a alguien a quedarse!