c# - que - message error genérico en gdi+ string
¿Cómo encontrar el motivo del error GDI+genérico al guardar una imagen? (6)
Al tener un código que funciona durante años al cargar y almacenar imágenes, descubrí que tengo una sola imagen que rompe este código:
const string i1Path = @"c:/my/i1.jpg";
const string i2Path = @"c:/my/i2.jpg";
var i = Image.FromFile(i1Path);
i.Save(i2Path, ImageFormat.Jpeg);
La excepción es:
Se produjo System.Runtime.InteropServices.ExternalException
Se produjo un error genérico en GDI +.
en System.Drawing.Image.Save (String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
en System.Drawing.Image.Save (nombre de archivo de cadena, formato ImageFormat)
a ...
Por lo que puedo ver, no hay nada especial en la imagen. Tiene aproximadamente 250 píxeles de tamaño y puede abrirse en, por ejemplo, Windows Image Viewer o Paint.NET:
(Dado que la imagen de arriba, después de cargarla en Stack Overflow ya no produce el error, he colocado la imagen original aquí )
Lo que descubrí es que al llamar al método Save
, el archivo de imagen de destino se está creando con cero bytes.
Realmente no tengo ni idea de qué causa el error.
Mis preguntas:
- ¿Se te ocurre alguna cosa especial que impida que .NET guarde la imagen?
- ¿Hay alguna forma (aparte de paneo) para reducir este tipo de errores?
Abierto en el programa.
const string i1Path = @"c:/my/i1.jpg";
const string i2Path = @"c:/my/i2.jpg";
var i = Image.FromFile(i1Path);
i.Save(i2Path, ImageFormat.Jpeg);
i.Dispose();
El motivo puede ser que la imagen se haya cargado perezosamente y que el proceso de carga aún no haya terminado cuando intenta guardarla.
Seguir lo que se dice en esta publicación del blog (suponiendo que sea alemán por la imagen que vinculó en su pregunta) proporciona una posible solución. Además, la respuesta aceptada de esta pregunta SO indica que esto se debe al hecho de que el archivo de imagen que está intentando guardar está bloqueado.
EDITAR
Para Ulysses Alves, de la entrada del blog vinculado: si carga una imagen con Image.FromFile()
, permanece bloqueada hasta que se elimine. Esto evita llamadas a Save()
.
pictureBox1.Image = Image.FromFile("C://test//test1.jpg");
pictureBox1.Image.Save("C://test//test2.jpg");
El código anterior arroja un error.
Para que funcione, necesitas copiar la imagen. El siguiente código funciona:
pictureBox1.Image = Image.FromFile("C://test//test1.jpg");
Image copy = pictureBox1.Image;
copy.Save("C://test//test2.jpg")
En primer lugar, asegúrese de que la carpeta deseada tenga permisos de Lectura / Escritura. Cambiar los permisos resolvió este problema para mí.
La solución está aquí, debe desechar el objeto de imagen para liberar la memoria en el servidor. Trate de usar el using
declaración. Asegúrese de que el directorio de destino en el servidor también exista.
Si bien todavía no descubrí la razón que causó exactamente el error al guardar la imagen, encontré una solución que aplicar:
const string i1Path = @"c:/my/i1.jpg";
const string i2Path = @"c:/my/i2.jpg";
var i = Image.FromFile(i1Path);
var i2 = new Bitmap(i);
i2.Save(i2Path, ImageFormat.Jpeg);
Es decir, al copiar la imagen internamente en una instancia de Bitmap
y al guardar esta imagen en lugar de la imagen original, el error desapareció.
Supongo que al copiarlo, las partes erróneas que causaron el fallo de la llamada de guardado original se eliminan o normalizan, permitiendo así que la operación de guardado tenga éxito.
Curiosamente, la imagen almacenada tiene un archivo más pequeño en el disco (16 kB) que su fuente original (26 kB).
mi solución fue hacer, escribir contenido temporal (File.WriteAllText) justo antes de guardar el archivo
Aquí está el código:
var i = Image.FromFile(i1Path);
File.WriteAllText(i2Path, "empty"); // <---- magic goes here
i.Save(i2Path, ImageFormat.Jpeg);
Por favor, trate y hágamelo saber