2011-08-18 32 views
19

he cargado una imagen en un cuadro de imagen usando:un error genérico en GDI +

picturebox1.Image = Image.FromFile() 

y ahorro mediante el uso de:

Bitmap bm = new Bitmap(pictureBox1.Image); 
bm.Save(FileName, ImageFormat.Bmp); 

Funciona perfectamente bien cuando se crea un nuevo archivo, pero cuando intento de reemplazar la imagen existente, que se tiran el siguiente error de ejecución:

A generic error occurred in GDI+

Entonces, ¿qué puedo hacer para resolver ¿¿este problema??

Respuesta

15

Eso debido a que el archivo de imagen es utilizada por su picturebox1.Image, trata de guardarlo en diferente ruta de archivo en su lugar:

picturebox1.Image = Image.FromFile(FileName); 
Bitmap bm = new Bitmap(pictureBox1.Image); 
bm.Save(@"New File Name", ImageFormat.Bmp); 

Editar: También puede añadir una copia de la imagen en el primer lugar como :

picturebox1.Image = new Bitmap(Image.FromFile(FileName)); 
Bitmap bm = new Bitmap(pictureBox1.Image); 
bm.Save(FileName, ImageFormat.Bmp);//no error will occurs here. 
+1

Gracias. Si quiero reemplazar, ¿no puedo hacer eso? – Lakshani

+0

Si desea reemplazar, primero debe eliminar la imagen de 'pictureBox.Image' luego reemplazarla, y luego volver a agregarla a' pictureBox.Image', también puede agregar una copia de su imagen en el cuadro de imagen en primer lugar ... –

+0

@ Lakshani: no se olvide de marcar la respuesta que responde a su pregunta como [respuesta aceptada] (http://meta.stackexchange.com/questions/5234/how-does-accepting- an-answer-work/5235 # 5235) para que otros sepan cómo se resolvió su problema. –

1

prueba esto.

picturebox1.Image = Image.FromFile(FileName); 
Bitmap bm = new Bitmat(pictureBox1.Image); 
Image img = (Image)b; 
img.Save(FileName, ImageFormat.Bmp); 
+0

En este código, ese problema ha ocurrido. – Lakshani

+0

primero debe definir openfiledialog. que leer la imagen del archivo y utilizar estos códigos. te ayudará. – TheMuyu

6

El método FromFile bloquea el archivo, a fin de utilizar el método deImage.FromStream() para la lectura de la imagen:

byte[] bytes = System.IO.File.ReadAllBytes(filename); 
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes); 
pictureBox1.Image = Image.FromStream(ms); 

continuación, guardar como estaba antes.

+0

¡Creo que esto puede haber solucionado un problema que he estado experimentando durante meses! – ScruffyDuck

+0

¡Por supuesto! @ScruffyDuck, el método ** Image.FromFile ** abrirá ese archivo de imagen. – adatapost

+0

@Jon tuerca no hay un método de ahorro? – Lakshani

4

Esto también puede suceder si la ruta de acceso no existe.

Se puede crear el directorio con:

System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(FileName)); 
1

Cuando ya sea un objeto de mapa de bits o un objeto de imagen 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ó. ocurrió http://support.microsoft.com/?id=814675

un error genérico en GDI +, imagen JPEG a MemoryStream:

Image.Save(..) // throws a GDI+ exception because the memory stream is closed 

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

EDIT: Sólo escribir de la memoria. Guardar en un 'intermediario' MemoryStream debería funcionar:

Por ejemplo, en lugar de esto:

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

Al igual que @Jalal Aldeen Saa'd dijo, el cuadro la caja está usando el archivo y bloqueada desde el reemplazo del archivo.

//unlock file by clearing it from picture box 
if (picturebox1.Image != null) 
{ 
    picturebox1.Image.Dispose(); 
    picturebox1.Image = null; 
} 

//put back the picture inside the pictureBox? 
0

probar esto va a funcionar

public void SavePicture() 
{ 
    Bitmap bm = new Bitmap(this.myBitmap) 
    bm.Save("Output\\out.bmp" ,System.Drawing.Imaging.ImageFormat.Bmp); 
} 
+0

También resuelve el error de gdi + –

0

Esto también puede ocurrir si se olvida de añadir el nombre del archivo:

bm.Save(@"C:\Temp\Download", System.Drawing.Imaging.ImageFormat.Png); 

Y se puede fijar mediante la adición del nombre de archivo:

bm.Save(@"C:\Temp\Download\Image.png", System.Drawing.Imaging.ImageFormat.Png); 

Nota: en realidad no tiene que agregue la extensión para que funcione.

0

Prueba esto:

private void LoadPictureBoxWithImage(string ImagePath) 
{ 
    Stream objInputImageStream = null; 
    BitmapData bmdImageData = null; 
    Bitmap bmpSrcImage = null, bmTemp = null; 
    byte[] arrImageBytes = null; 
    int bppModifier = 3; 
    try 
    { 

     objInputImageStream = new MemoryStream(); 
     using (FileStream objFile = new FileStream(ImagePath, FileMode.Open, FileAccess.Read)) 
     { 
      objFile.CopyTo(objInputImageStream); 
     } 

     bmpSrcImage = new Bitmap(objInputImageStream); 
     bppModifier = bmpSrcImage.PixelFormat == PixelFormat.Format24bppRgb ? 3 : 4; 

     //reda from byte[] to bitmap    
     bmdImageData = bmpSrcImage.LockBits(new Rectangle(0, 0, bmpSrcImage.Width, bmpSrcImage.Height), ImageLockMode.ReadOnly, bmpSrcImage.PixelFormat); 
     arrImageBytes = new byte[Math.Abs(bmdImageData.Stride) * bmpSrcImage.Height]; 

     System.Runtime.InteropServices.Marshal.Copy(bmdImageData.Scan0, arrImageBytes, 0, arrImageBytes.Length); 
     bmpSrcImage.UnlockBits(bmdImageData); 

     pbSetup.Image = (Bitmap)bmpSrcImage.Clone(); 
     pbSetup.Refresh(); 

    } 
    catch (Exception ex) 
    { 
     throw new Exception("Error in Function " + System.Reflection.MethodInfo.GetCurrentMethod().Name + "; " + ex.Message); 
    } 
    finally 
    { 
     if (objInputImageStream != null) 
     { 
      objInputImageStream.Dispose(); 
      objInputImageStream = null; 
     } 
     if (bmdImageData != null) 
     { 
      bmdImageData = null; 
     } 
     if (bmpSrcImage != null) 
     { 
      bmpSrcImage.Dispose(); 
      bmpSrcImage = null; 
     } 
     if (bmTemp != null) 
     { 
      bmTemp.Dispose(); 
      bmTemp = null; 
     } 
     if (arrImageBytes != null) 
     { 
      arrImageBytes = null; 
     } 
    } 

} 
Cuestiones relacionadas