Tener un código que funciona para las edades cuando se carga y almacenamiento de imágenes, descubrí que tengo una sola imagen que rompe con 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:

Sistema.En tiempo de ejecución.InteropServices.ExternalException ocurrido

Un error genérico que se produjo en GDI+.

al Sistema.De dibujo.Imagen.Guardar(String filename, ImageCodecInfo codificador, EncoderParameters encoderParams)

en el Sistema.De dibujo.Imagen.Guardar(String filename, ImageFormat formato)

en …

Tan lejos como puedo ver, no hay nada especial acerca de la imagen. Es de aprox 250 píxeles de tamaño y se puede abrir en, por ejemplo, Windows Visor de Imágenes o Paint.NET:

Cómo encontrar la razón por la Genérica de GDI+ de error al guardar una imagen?

(Desde la imagen de arriba, después de ser cargado de Desbordamiento de la Pila, no se produce el error más, me he puesto la imagen original aquí)

Lo que he descubierto es que tras llamar a la Guardar método, el destino del archivo de imagen creado con cero bytes.

Estoy muy desorientado sobre lo que provoca el error.

Mis preguntas:

  • Puede usted pensar en alguna cosa especial que dificulte .NETO de ahorro de la imagen?
  • Hay alguna manera (al lado de causar pánico) para reducir este tipo de errores?
  • MSDN dice que un mapa de bits cargado de una Corriente requiere que el Flujo de permanecer en la existencia tan larga como la de mapa de bits existe.
  • Unreleated a su problema: Pero la misma excepción occoures si la ruta no existe (me tomó un tiempo para averiguar tuve un error tipográfico). Podría ayudar a alguien más.
InformationsquelleAutor Uwe Keim | 2013-03-22

8 Comentarios

  1. 36

    Mientras que todavía no se dieron cuenta de la razón por la qué provocó el error al guardar la imagen, he encontrado una solución para 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);

    I. e. copiando la imagen internamente en una mapa de bits instancia y guardar esta imagen en lugar de la imagen original, el error desapareció.

    Estoy suponiendo que al copiarlo, la errónea partes de la causó el original Save llamada a fallar están siendo retirados y/o normalizado, lo que permite la operación de guardar para tener éxito.

    Cómo encontrar la razón por la Genérica de GDI+ de error al guardar una imagen?

    Curiosamente, la imagen almacenada tiene un pequeño archivo en el disco (16 kB) de su fuente original (26 kB).

    • La construcción de un nuevo mapa de bits(oldImage) también resuelto mi problema…
    • Esto funcionó para mí. Tuve que forzar la recolección de basura después, en la cuenta de ‘fuera de la excepción de memoria’ que fue causado.
    • Trabajó también para mí – ni idea de por qué. Sólo tenía el problema con las imágenes jpg png (etc estaban bien)
    • Tuve este problema con .bmp, .jpg, y .png pero no se me carga un archivo, fue crear en la memoria y tratando de salvar. CAUSE: el mapa de bits original está ligado a la corriente de la carga de (FileStream o MemoryStream). El clonado de mapa de bits que no están vinculados a un arroyo, como se copian los píxeles de bytes. Es que también han trabajado para Freeze el mapa de bits original antes de guardarlo.
  2. 13

    Primero asegúrese de que la carpeta tiene permisos de Lectura/Escritura. Cambiar los permisos resuelto este problema para mí.

    • Gracias. A mí me funciona.
    • Que como el 90% de los casos 🙂
  3. 7

    Solución está aquí, usted debe deshacerse de la imagen de objetos para liberar la memoria en el servidor.
    Trate de usar using declaración. Asegúrese de que el directorio de destino en el servidor existe demasiado.

    • Esto suena como un realmente una mala respuesta para mí.
    • «Asegúrese de que el directorio de destino en el servidor existe» era mi problema
    • un using temporal IDisposable objeto sólo asegura que la GC es un llamado para que tan pronto como sea seguro hacerlo.
    • «Asegúrese de que el directorio de destino en el servidor existe» era mi problema así
    • «Asegúrese de que el directorio de destino en el servidor existe» era mi problema. Tan fácil de pasar por alto.
  4. 4

    La razón puede ser que la imagen se carga con pereza y el proceso de carga no está todavía terminado cuando intenta guardar.

    A raíz de lo que dice en la este blog (suponiendo que eres alemán por la imagen que enlaza en su pregunta) proporciona una solución posible. También de este MODO la pregunta aceptado la respuesta indica que esto es debido al hecho de que el archivo de imagen que está tratando de salvar a está bloqueado.

    EDITAR

    Para Ulises Alves, de los vinculados entrada en el blog: Si se carga una imagen utilizando Image.FromFile() permanece bloqueado hasta que se eliminan. Esto evita que las llamadas a Save().

    pictureBox1.Image = Image.FromFile("C:\test\test1.jpg");
    pictureBox1.Image.Save("C:\test\test2.jpg");

    El código anterior produce un error.

    Para hacerlo funcionar, usted necesita una copia de 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")
    • Yo realmente no se por qué esta respuesta está siendo votada abajo … tal vez alguien podría explicar?
    • Desde abajo los votantes no dejar un comentario, nunca lo sabremos. 🙂
    • Yo no podía encontrar cualquier cosa relacionada con este tema en el post vinculado. Podría usted por favor nos proporciona un ejemplo de código en su respuesta?
  5. 3

    mi solución fue hacer, escribir temp contenido (Archivo.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 intente y me dejó saber

    • Puedo ver a dónde iba a cambiar cuando/donde recibió la excepción si usted no tiene permiso para crear ese archivo. 🙂 🙂 Pero sería raro si esto resuelve los otros asuntos en la OP. bitmap.Freeze(); bitmap.Save(...); o var other = new Bitmap(bitmap); other.Save(...); Ambos de estos asegurarse de que el mapa de bits de ser salvos, que no está vinculado a una corriente antes de Save se llama.
  6. 3

    He encontrado esta pregunta porque yo también enfrentan el error similar y el archivo fue creado con una longitud cero (si usted no ve ningún archivo, compruebe los permisos para escribir en la carpeta como otras respuestas sugieren). A pesar de que mi código es ligeramente diferente (yo uso stream para leer la imagen desde la memoria, no desde un archivo), creo que mi respuesta puede ser útil para cualquier persona que enfrenta un problema similar.

    Puede parece contra-intuitivo, pero realmente no se puede disponer de la memoria de secuencia hasta terminar con la imagen.

    NO FUNCIONA:

    Image patternImage;
    
    using (var ms = new MemoryStream(patternBytes)) {
        patternImage = new Bitmap(ms);
    }
    
    patternImage.Save(patternFile, ImageFormat.Jpeg);

    Simplemente no disponer de la corriente hasta que se hace con la imagen.

    OBRAS:

    using (var ms = new MemoryStream(patternBytes)) {
        patternImage = new Bitmap(ms);
        patternImage.Save(patternFile, ImageFormat.Jpeg);
    }

    Lo que es engañoso:

    • Mensaje de Error no dice realmente nada
    • Usted puede ver las propiedades de la imagen, como la anchura y la altura, pero no se puede
      guardar
    • Yo tenía un similar tipo de problema y la solución funcionó para mí. Gracias.
    • se menciona en la documentación acerca de la lectura de una imagen y convertirla en un mapa de bits antes de guardarlo?
  7. 0

    Abrir 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();
  8. -2

    Información Clave:

    //Using System.Drawing.Imaging:
    new Bitmap(image).Save(memoryStream, ImageFormat.Jpeg);

    Que DEBE Elenco de la Imagen a un mapa de bits para guardarlo.

    Uso:

    //Using System.Drawing.Imaging:
    image.Save(memoryStream, ImageFormat.Jpeg);

    VA a tirar el Error:

    Genérico de GDI+ de error al guardar una imagen

Dejar respuesta

Please enter your comment!
Please enter your name here