web-dev-qa-db-fra.com

Une erreur générique s'est produite dans GDI +

J'ai chargé une image dans une zone d'image en utilisant:

picturebox1.Image = Image.FromFile()

et je le sauvegarde en utilisant:

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

Cela fonctionne parfaitement lors de la création d'un nouveau fichier, mais lorsque j'essaie de remplacer l'image existante, l'erreur d'exécution suivante est générée: 

Une erreur générique s'est produite dans GDI +

Alors, que puis-je faire pour résoudre ce problème? 

19
Lakshani

Cela parce que le fichier image est utilisé par votre picturebox1.Image, essayez plutôt de l'enregistrer dans un autre chemin:

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

Edit: Vous pouvez aussi ajouter une copie de l'image à la première place comme:

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

La méthode FromFile verrouille le fichier, utilisez donc la méthode Image.FromStream () pour lire l'image:

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

Puis sauvez comme vous étiez avant.

6
adatapost

Cela peut aussi arriver si le chemin n'existe pas.

Vous pouvez créer le répertoire avec:

System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(FileName));
4
weston

Lorsqu'un objet Bitmap ou un objet Image est construit à partir d'un fichier, le fichier reste verrouillé pendant toute la durée de vie de l'objet. Par conséquent, vous ne pouvez pas modifier une image et la sauvegarder dans le même fichier d'origine. http://support.Microsoft.com/?id=814675

Une erreur générique s'est produite dans GDI +, Image JPEG dans MemoryStream:

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

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

EDIT: J'écris juste de la mémoire. L'enregistrement dans un 'intermédiaire' MemoryStream devrait fonctionner:

Par exemple, remplacez ceci:

Bitmap newBitmap = new Bitmap(thumbBMP);
thumbBMP.Dispose();
thumbBMP = null;
newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);

avec quelque chose comme:

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

essaye ça.

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

Essaye ça:

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

}
0
Kalpana

Comme @Jalal Aldeen Saa'd l'a dit, la zone d'image utilise le fichier et est verrouillée contre le remplacement de fichier.

//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
V-SHY

Cela peut aussi arriver si vous oubliez d'ajouter le nom de fichier:

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

Et peut être corrigé en ajoutant le nom du fichier:

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

Remarque: vous n'avez pas réellement besoin d'ajouter l'extension pour que cela fonctionne.

0
AzzamAziz

essayez ça va marcher

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