Esto parece ser un error infame en toda la web. Tanto es así que no he podido encontrar una respuesta a mi problema ya que mi escenario no encaja. Se produce una excepción cuando guardo la imagen en la transmisión.
Extrañamente, esto funciona perfectamente con un png pero da el error anterior con jpg y gif, que es bastante confuso.
El problema más similar se relaciona con guardar imágenes en archivos sin permisos. Irónicamente, la solución es usar un flujo de memoria como lo estoy haciendo ...
public static byte[] ConvertImageToByteArray(Image imageToConvert)
{
using (var ms = new MemoryStream())
{
ImageFormat format;
switch (imageToConvert.MimeType())
{
case "image/png":
format = ImageFormat.Png;
break;
case "image/gif":
format = ImageFormat.Gif;
break;
default:
format = ImageFormat.Jpeg;
break;
}
imageToConvert.Save(ms, format);
return ms.ToArray();
}
}
Más detalles a la excepción. La razón por la que esto causa tantos problemas es la falta de explicación :(
System.Runtime.InteropServices.ExternalException was unhandled by user code
Message="A generic error occurred in GDI+."
Source="System.Drawing"
ErrorCode=-2147467259
StackTrace:
at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
at System.Drawing.Image.Save(Stream stream, ImageFormat format)
at Caldoo.Infrastructure.PhotoEditor.ConvertImageToByteArray(Image imageToConvert) in C:\Users\Ian\SVN\Caldoo\Caldoo.Coordinator\PhotoEditor.cs:line 139
at Caldoo.Web.Controllers.PictureController.Croppable() in C:\Users\Ian\SVN\Caldoo\Caldoo.Web\Controllers\PictureController.cs:line 132
at lambda_method(ExecutionScope , ControllerBase , Object[] )
at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
InnerException:
OK cosas que he probado hasta ahora.
- Clonando la imagen y trabajando en eso.
- Recuperando el codificador para ese MIME pasando eso con la configuración de calidad jpeg.
Respuestas:
OK. Parece que encontré la causa por pura suerte y no tiene nada de malo con ese método en particular, es una copia de seguridad de la pila de llamadas.
Anteriormente cambio el tamaño de la imagen y como parte de ese método devuelvo el objeto redimensionado de la siguiente manera. He insertado dos llamadas al método anterior y un guardado directo en un archivo.
Parece que la secuencia de memoria que el objeto se creó el tiene que ser abierta en el momento de guardar el objeto. No estoy seguro de por qué es esto. ¿Alguien puede iluminarme y cómo puedo evitar esto?
Solo regreso de una secuencia porque después de usar el código de cambio de tamaño similar a este, el archivo de destino tiene un tipo MIME desconocido (img.RawFormat.Guid) y me gustaría que el tipo MIME sea correcto en todos los objetos de imagen, ya que dificulta la escritura genérica manejo de código de lo contrario.
EDITAR
Esto no apareció en mi búsqueda inicial, pero aquí está la respuesta de Jon Skeet
fuente
Si obtiene ese error, entonces puedo decir que su aplicación no tiene permiso de escritura en algún directorio.
Por ejemplo, si está intentando guardar la imagen de la secuencia de memoria en el sistema de archivos, puede recibir ese error.
Por favor, si está utilizando XP, asegúrese de agregar permiso de escritura para la cuenta aspnet en esa carpeta.
Si está utilizando el servidor de Windows (2003,2008) o Vista, asegúrese de agregar permiso de escritura para la cuenta de servicio de red.
Espero que ayude a alguien.
fuente
También agregaré esta causa del error con la esperanza de que ayude a algún futuro viajero de Internet. :)
GDI + limita la altura máxima de una imagen a 65500
Hacemos un cambio de tamaño básico de la imagen, pero al cambiar el tamaño intentamos mantener la relación de aspecto. Tenemos un tipo de control de calidad que es demasiado bueno en este trabajo; decidió probar esto con una foto de UNO de ancho que tenía 480 píxeles de alto. Cuando la imagen se ajustó para cumplir con nuestras dimensiones, la altura era al norte de 68,000 píxeles y nuestra aplicación explotó
A generic error occurred in GDI+
.Puede verificar esto usted mismo con la prueba:
Es una pena que no haya un .net amigable
ArgumentException
en el constructor deBitmap
.fuente
Este artículo explica en detalle qué sucede exactamente: dependencias del constructor de mapas de bits e imágenes
En resumen, durante toda la vida de un
Image
construido a partir de una corriente , la corriente no debe ser destruida.Entonces, en lugar de
prueba esto
y cierre imageStream al cerrar el formulario o cerrar la página web.
fuente
using
y luego intenté copiar la imagen en una transmisión de memoria y recibí el terrible mensaje "Error genérico en GDI +".PixelFormat.Format32bppArgb
pero noPixelFormat.Format1bppIndexed
. El artículo que vinculó explica por qué: GDI + puede optar por volver a decodificar datos de mapa de bits de la secuencia de origen en lugar de mantener todo en la memoria. Supongo que no vuelve a decodificar imágenes de 1bpp.También obtendrá esta excepción si intenta guardar en una ruta no válida o si hay un problema de permisos.
Si no está 100% seguro de que la ruta del archivo esté disponible y los permisos sean correctos, intente escribir un archivo de texto. Esto toma solo unos segundos para descartar lo que sería una solución muy simple.
Y no olvides limpiar tu archivo.
fuente
Guardar imagen en variable de mapa de bits
fuente
Por si acaso si alguien está haciendo cosas tan estúpidas como yo. 1. Asegúrese de que el camino existe. 2. asegúrese de tener permisos para escribir. 3. asegúrese de que su ruta sea correcta, en mi caso me faltaba el nombre del archivo en TargetPath :(
debería haber dicho, su ruta es una mierda que "Se produjo un error genérico en GDI +"
fuente
También recibí este error al guardar archivos JPEG, pero solo para ciertas imágenes.
Mi codigo final:
No creé las imágenes, así que no puedo decir cuál es la diferencia.
Agradecería si alguien pudiera explicar eso.
Esta es mi función SaveJpeg solo para tu información:
fuente
Descubrí que si una de las carpetas principales donde guardaba el archivo tenía un espacio final, GDI + arrojaría la excepción genérica.
En otras palabras, si intenté guardar en "C: \ Documents and Settings \ myusername \ Local Settings \ Temp \ ABC DEF M1 Trended Values \ Images \ picture.png", arrojó la excepción genérica.
El nombre de mi carpeta se generaba a partir de un nombre de archivo que tenía un espacio final, por lo que era fácil .Trim () eso y seguir adelante.
fuente
si su código es el siguiente, también se produce este error
El correcto es
Esto puede deberse a que estamos regresando del bloque using
fuente
Esta es una expansión / calificación de la respuesta de Fred que declaró: "GDI limita la altura de una imagen a 65534". Nos encontramos con este problema con una de nuestras aplicaciones .NET, y después de ver la publicación, nuestro equipo de outsourcing levantó las manos en el aire y dijo que no podían solucionar el problema sin cambios importantes.
Según mis pruebas, es posible crear / manipular imágenes con una altura superior a 65534, pero el problema surge cuando se guarda en una secuencia o archivo EN DETERMINADOS FORMATOS . En el siguiente código, la llamada al método t.Save () arroja a nuestro amigo la excepción genérica cuando la altura del píxel es 65501 para mí. Por curiosidad, repetí la prueba de ancho y el mismo límite se aplicó al ahorro.
El mismo error también se produce si escribe en una secuencia de memoria.
Para evitarlo, puede repetir el código anterior y sustituir ImageFormat.Tiff o ImageFormat.Bmp por ImageFormat.Jpeg.
Esto se extiende hasta alturas / anchos de 100,000 para mí, no probé los límites. Como sucede. Tiff fue una opción viable para nosotros.
Ser advertido
Las secuencias / archivos TIFF en memoria consumen más memoria que sus contrapartes JPG.
fuente
Tuve un problema muy similar y también intenté clonar la imagen que no funciona. Descubrí que la mejor solución era crear un nuevo objeto de mapa de bits a partir de la imagen que se cargó desde el flujo de memoria. De esa manera, la corriente se puede eliminar, por ejemplo
Espero que esto ayude.
fuente
Se produjo un error debido al permiso. asegúrese de que la carpeta tenga TODO EL PERMISO.
fuente
RESUELTO - Tuve este problema exacto. La solución, para mí, era aumentar la cuota de disco para IUSR en el servidor IIS. En este caso, tenemos una aplicación de catálogo con imágenes de artículos y demás. La cuota de carga para el "Usuario web anónimo" se estableció en 100 MB, que es el valor predeterminado para los servidores IIS de esta empresa de hosting en particular. Lo subí a 400 MB y pude subir imágenes sin error.
Este podría no ser su problema, pero si lo es, es una solución fácil.
fuente
En mi caso, el problema estaba en la ruta que estaba guardando (la raíz
C:\
). Cambiarlo para queD:\111\
la excepción desaparezca.fuente
Otra causa de este error: la ruta que indica en el método Save de la instancia de mapa de bits no existe o no ha proporcionado una ruta completa / válida.
¡Acabo de tener este error porque estaba pasando un nombre de archivo y no una ruta completa!
¡Sucede!
fuente
¡Mi turno!
Lo tengo en .Guardar ... porque el uso () mantiene abierto el archivo, por lo que no puedo sobrescribirlo. Quizás esto ayude a alguien en el futuro.
fuente
Mismo problema que estaba enfrentando. Pero en mi caso, estaba tratando de guardar el archivo en la unidad C y no estaba accesible. Así que intenté guardarlo en la unidad D, que era completamente accesible y lo logré.
Así que primero verifique las carpetas en las que está intentando guardar. Debe tener todos los derechos (de lectura y escritura) para esa carpeta en particular.
fuente
Noté que su caso "jpeg" es en realidad:
¿Estás seguro de que el formato es JPEG y no otra cosa?
Lo intentaría:
O revise lo
imageToConvert.MimeType()
que realmente está regresando.ACTUALIZAR
¿Hay alguna otra inicialización que necesite hacer al objeto MemoryStream?
fuente
fuente
Solo para lanzar otra posible solución al montón, mencionaré el caso con el que me encontré con este mensaje de error. El método
Bitmap.Save
arrojaría esta excepción al guardar un mapa de bits que había transformado y que estaba mostrando. Descubrí que no arrojaría la excepción si la declaración tenía un punto de interrupción, ni lo haría siBitmap.Save
fuera precedida porThread.Sleep(500)
lo que supongo que está sucediendo algún tipo de contención de recursos.Simplemente copiar la imagen a un nuevo objeto de mapa de bits fue suficiente para evitar que aparezca esta excepción:
fuente
Tuvimos un problema similar al generar
PDF
o cambiar el tamaño de la imagen usando ImageProcessor lib en el servidor de producción.Reciclar el grupo de aplicaciones soluciona el problema.
fuente
Si está intentando guardar una imagen en una ubicación remota, asegúrese de agregar la
NETWORK_SERVICE
cuenta de usuario en la configuración de seguridad y otorgarle permisos de lectura y escritura. De lo contrario, no va a funcionar.fuente
fuente
También recibo este error porque estoy tratando de guardar imágenes con el mismo nombre de imágenes guardadas anteriores.
Asegúrese de no guardar imágenes con nombre duplicado.
Utilice para thar, por ejemplo, una función 'Aleatoria' ( ¿Cómo funciona el generador de números aleatorios de C #? ) O, por ejemplo, genere un Guid ( http://betterexplained.com/articles/the-quick-guide-to-guids/ )
fuente
Simple, crear una nueva instancia de Bitmap resuelve el problema.
fuente
Para mí estaba usando el
Image.Save(Stream, ImageCodecInfo, EncoderParameters)
y aparentemente esto estaba causando la infameA generic error occurred in GDI+
error.Estaba tratando de usar
EncoderParameter
para guardar los archivos JPEG en 100% de calidad. Esto funcionaba perfectamente en "mi máquina" (¡sí!) Y no en la producción.Cuando usé el
Image.Save(Stream, ImageFormat)
en lugar, ¡el error desapareció! Entonces, como un idiota, seguí usando este último, aunque los guarda en la calidad predeterminada, que supongo que es solo el 50%.Espero que esta información ayude a alguien.
fuente
También encontré el problema. El problema se debió a la eliminación de la corriente de carga. Pero no lo eliminé, estaba dentro de .Net framework. Todo lo que tenía que hacer era usar:
en vez de
image_instance es de tipo System.Windows.Forms.PictureBox! PictureBox's Load () elimina la secuencia desde la que se cargó la imagen, y no lo sabía.
fuente
Según la respuesta de @savindra, si utiliza RHM en su aplicación e intenta ejecutarse como administrador, entonces debería resolver su problema.
El mío parecía ser un problema de permiso.
fuente
Los posibles problemas que causan tal error son:
Espero que esto ayude, esta fue la solución para mi problema, ¡simplemente me aseguré de que el directorio de salida exista antes de guardar la imagen de salida!
fuente