web-dev-qa-db-fra.com

Une erreur générique se produit sur GDI + sur Bitmap.Save () après l'utilisation de SaveFileDialog

J'utilise le bloc de code suivant avec un peu plus de code à l'intérieur du bloc using:

using (System.Drawing.Bitmap tempImg =
       (System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap))
{
    // ...
    tempImg.Save("..\\..\\testdata\\tempImg.bmp", ImageFormat.Bmp);                            
    // ...
}

Mais j'obtiens toujours l'erreur:

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

seulement après avoir effectué une action qui n’est pas liée au code contenu dans le bloc using. Dans d'autres cas, cela fonctionne bien ..__ également. Le fichier tempImg.bmp étant un fichier temporaire, je supprime le fichier tempImg.bmp du bloc using. 

Puisque le tempImg est à l'intérieur de l'utilisation et que c'est disposé, je pense que le problème du verrouillage devrait être résolu. 

Quelqu'un peut-il s'il vous plaît laissez-moi savoir quelle est l'erreur dans ce code? 

Éditez: System.Drawing.Image à System.Drawing.Bitmap en tant que type de tempImg.

Edit: J'ai identifié cette erreur uniquement après la création de SaveFileDialog et le clic de l'utilisateur sur "Enregistrer".

24
Dulini Atapattu

Enfin, je pouvais trouver ce qui n'allait pas dans mon code et je voudrais le mentionner ici, car je pense que cela pourrait être utile à quelqu'un ...

Comme j'ai donné un chemin relatif dans tempImg.Save, et après que l'utilisateur ait cliqué sur "Enregistrer" dans SaveFileDialog, le chemin actuel de tempImg.Save devient:

Chemin spécifié par SaveFileDialog + le chemin relatif

automatiquement.

Ainsi, si le chemin n'existe pas, cette erreur se produit.

Merci à tous pour les réponses. 

40
Dulini Atapattu

J'ai également eu une fois ce problème - cela se produit parce que le bitmap est verrouillé et que vous ne pouvez pas l'enregistrer (si vous voulez, je peux trouver l'explication exacte), de toute façon une solution est la suivante: bitmap d'origine que vous avez copié le bitmap d'origine dans le nouveau bitmap créé, puis disposez le bitmap d'origine et enregistrez le nouveau.

Bitmap bm3 = new Bitmap(bm2);

Et puis enregistrez.

17
Eli Braginskiy

Cela indique généralement que quelque chose d'autre, potentiellement un autre thread dans votre propre application, a déjà verrouillé le fichier cible que vous essayez de sauvegarder au niveau du système de fichiers. Si vous regardez l'exception intérieure, je pense qu'il devrait en être fait mention. Si ce n’est pas directement dans l’exception InnerException Une autre façon de le confirmer (ou de découvrir ce que cela pourrait être réellement) est d’activer les exceptions de la première chance dans le débogueur et de regarder quelle exception est lancée "sous", puis sauvegardée puis transformée en cette exception exception générique.

5
Drew Marsh

J'ai essayé toutes les solutions données ici, mais en vain. Trouvé la solution finalement.

  1. Éliminer tous les graphiques appliqués sur l'image: g.dispose();
  2. Assurez-vous que le chemin de sauvegarde existe: System.IO.Directory.Exists(dir);
4
Umar Hassan

Est-ce une application ASP.NET?

Une erreur générique s'est produite au niveau de GDI + dans asp.net, principalement en raison de l'absence des autorisations d'accès au dossier cible.

De plus, votre code pourrait être simplifié pour:

       using (Image image= dataObject.GetImage())
       {
            if (image != null)
            {
                image.Save("test.bmp");
            }
        }
1
Vijay Sirigiri

Dans mon cas, c’était une application ASP.NET dans laquelle je remplaçais une seule DLL et je devais simplement redémarrer le pool d’applications après le déploiement. Ensuite, cela a bien fonctionné.

1
Fabian

Une erreur générique se produit au niveau de GDI + sur Bitmap.Save () est généralement reçue lorsque le dossier est protégé ou que le nom du fichier n'est pas valide.

Une erreur courante consiste à oublier de créer un nom et d'écrire simplement le nom du dossier.

1
Kishore Sathia

Éliminez votre objet bitMap après l'enregistrement de l'image:

 bitMap.Dispose()
 oimg.Dispose()

 bitMap = Nothing
 oimg = Nothing
0
Lokesh Yadav

Je faisais face au même problème en remplaçant le type d'image ".bmp" par ".png".

0
Niraj Trivedi

Ceci est un exemple de code provenant des forums Microsoft. 

// new image with transparent Alpha layer
using (var bitmap = new Bitmap(330, 18, PixelFormat.Format32bppArgb))
{
    using (var graphics = Graphics.FromImage(bitmap))
    {
        // add some anti-aliasing
        graphics.SmoothingMode = SmoothingMode.AntiAlias;

        using (var font = new Font("Arial", 14.0f, GraphicsUnit.Pixel))
        {
            using (var brush = new SolidBrush(Color.White))
            {
                // draw it
                graphics.DrawString(user.Email, font, brush, 0, 0);
            }
        }
    }

    // setup the response
    Response.Clear();
    Response.ContentType = "image/png";
    Response.BufferOutput = true;

    // write it to the output stream
    bitmap.Save(Response.OutputStream, ImageFormat.Png);
    Response.Flush();
}
0
v00d00

J'essaie de sauvegarder l'image d'une ressource et cela me donne aussi l'erreur GDI lorsque j'utilise directement la méthode Bitmap.Save (chemin du fichier) . Je pense que nous pouvons utiliser le même code ci-dessous pour toute autre image bitmap le cloner. 

Private void SaveResourceImage() {
    object resBmpObject = Resource.Image1.Clone();//Bitmap Image from resource file
    //object resBmpObject = anyBmpImage.clone(); //for image other than resource image
    Bitmap resBmpImage = (Bitmap)resBmpObject;
    resBmpImage.Save(destFilePath, System.Drawing.Imaging.ImageFormat.Png);
    resBmpImage.dispose();
}
0
RoopzD

Dans mon cas, j’enregistrais le fichier bitmap au même emplacement que la source, C’est le problème qui se pose . J'enregistre le bitmap dans le nouvel emplacement et tout va bien maintenant.

0
saurabh_hcl