c# gdi+ system.drawing

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



system.drawing (13)

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); } }

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(); }


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


En mi caso, el archivo de imagen de mapa de bits 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

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.


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);


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.).


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);


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.


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 programa 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.


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"


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!


// 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 olvidó de uno. No está eliminando newBitmap . Que mantiene un bloqueo 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 declaración 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 mapa de bits, guardar thumbBMP ya debería ser lo suficientemente bueno. De todos modos, dale al resto de tus objetos desechables el mismo amor.


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);