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

j'utilise le bloc de code suivant avec un peu plus de code à l'intérieur de la à l'aide de bloc:

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

Mais j'ai toujours l'erreur:

a Generic Error occurred at GDI+

seulement après que j'ai fait quelque action qui n'est pas liée au code à l'intérieur du bloc d'utilisation. En d'autres temps, cela fonctionne bien. Aussi le tempImg.bmp est un fichier temporaire, donc je supprime le tempImg.bmp dans le bloc d'utilisation lui-même.

puisque le tempImg est à l'intérieur du en utilisant et ceci il est disposé, je pense que le problème de verrouillage devrait être résolu.

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

Edit: System.Drawing.ImageSystem.Drawing.Bitmap comme le type de tempImg.

Edit: J'ai identifié, j'obtiens cette erreur seulement après SaveFileDialog est créé et l'utilisateur clique sur "Enregistrer".

24
demandé sur Dulini Atapattu 2011-04-28 08:28:23

12 réponses

enfin j'ai pu trouver ce qui n'allait pas dans mon code et je voudrais le mentionner ici car je pense qu'il peut être utile à quelqu'un....

Comme j'ai donné un chemin relatif dans tempImg.Enregistrer, et après que l'utilisateur clique 'enregistrer' dans SaveFileDialog, le chemin réel pour tempImg.Enregistrer devenir :

chemin spécifié par SaveFileDialog + le chemin relatif

automatiquement.

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

Merci tous pour les réponses.

40
répondu Dulini Atapattu 2011-05-05 09:30:28

j'ai aussi eu une fois ce problème - il se produit parce que le bitmap se verrouille et vous ne pouvez pas l'enregistrer( si vous voulez je peux trouver l'explication exacte) donc de toute façon une correction autour est ceci: Créez un nouveau bitmap de la taille du bitmap original que vous avez - Copiez le bitmap original au nouveau bitmap créé et puis disposer du bitmap original et enregistrer le nouveau.

Bitmap bm3 = new Bitmap(bm2);

puis enregistrer.

16
répondu Eli Braginskiy 2011-04-28 09:26:49

c'est habituellement un indicateur que quelque chose d'autre, potentiellement un autre thread dans votre propre application, a déjà le fichier cible que vous essayez de sauvegarder verrouillé au niveau du système de fichiers. Si vous regardez l'exception intérieure, je crois qu'elle devrait mentionner ceci. Si ce n'est pas directement dans L'InnerException, une autre façon de le confirmer (ou de découvrir ce qu'il pourrait vraiment être à la place) est d'activer les exceptions de première chance dans le débogueur et de surveiller quelle exception est lancée. "underneath" Enregistrer puis être transformé en cette exception Générique.

5
répondu Drew Marsh 2011-04-28 05:01:19

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

  1. éliminez 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
répondu Umar Hassan 2012-08-15 20:48:47

Est-ce un ASP.NET application?

une erreur générique est survenue à GDI+ in asp.net principalement en raison de l'absence de permissions d'accès / dossier cible.

aussi votre code pourrait être simplifié à :

       using (Image image= dataObject.GetImage())
       {
            if (image != null)
            {
                image.Save("test.bmp");
            }
        }
1
répondu Vijay Sirigiri 2011-04-28 05:28:43

une erreur générique se produit à GDI+ à Bitmap.Save () est généralement reçu lorsque le dossier est protégé ou que le nom du fichier n'est pas valide.

une erreur courante est d'oublier de faire un nom et d'écrire seulement le nom du dossier.

1
répondu Kishore Sathia 2015-04-17 10:02:58

dans mon cas, c'était un ASP.NET application dans laquelle j'ai remplacé une seule DLL, et j'ai dû simplement redémarrer le pool d'application après le déploiement. Puis il a bien fonctionné.

1
répondu Fabian 2016-08-19 07:15:04

ceci est un exemple de code 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
répondu v00d00 2011-04-28 06:37:53

j'essaie de sauver l'image de la ressource et cela me donne trop d'erreur GDI quand j'utilise directement la méthode Bitmap.Enregistrer(filepath). Je pense que nous pouvons utiliser le même code ci-dessous pour n'importe quelle autre image bitmap en la clonant.

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
répondu RoopzD 2013-06-30 19:53:55

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

 bitMap.Dispose()
 oimg.Dispose()

 bitMap = Nothing
 oimg = Nothing
0
répondu Lokesh Yadav 2015-05-19 09:41:29

dans mon cas, j'enregistrais le fichier bitmap au même endroit que la source, Donc, c'est le problème. Je sauve le bitmap au nouvel emplacement et tout va bien maintenant.

0
répondu saur 2017-01-21 20:42:20

je faisais face au même problème, en changeant le type d'image ".bmp" pour ".png" ses travaux forment moi

0
répondu Niraj Trivedi 2017-06-27 03:33:58