Une erreur générique s'est produite dans GDI+ dans Bitmap.Méthode Save

je travaille à télécharger et enregistrer une copie de cette image dans un dossier de vignette.

j'utilise le lien suivant:

http://weblogs.asp.net/markmcdonnell/archive/2008/03/09/resize-image-before-uploading-to-server.aspx

mais

newBMP.Save(directory + "tn_" + filename);   

est à l'origine d'exception "générique erreur s'est produite dans GDI+."

j'ai essayé de donner permission sur le dossier, a également essayé d'utiliser un nouvel objet BMP séparé lors de l'enregistrement.

Edit:

    protected void ResizeAndSave(PropBannerImage objPropBannerImage)
    {
        // Create a bitmap of the content of the fileUpload control in memory
        Bitmap originalBMP = new Bitmap(fuImage.FileContent);

        // Calculate the new image dimensions
        int origWidth = originalBMP.Width;
        int origHeight = originalBMP.Height;
        int sngRatio = origWidth / origHeight;
        int thumbWidth = 100;
        int thumbHeight = thumbWidth / sngRatio;

        int bannerWidth = 100;
        int bannerHeight = bannerWidth / sngRatio;

        // Create a new bitmap which will hold the previous resized bitmap
        Bitmap thumbBMP = new Bitmap(originalBMP, thumbWidth, thumbHeight);
        Bitmap bannerBMP = new Bitmap(originalBMP, bannerWidth, bannerHeight);

        // Create a graphic based on the new bitmap
        Graphics oGraphics = Graphics.FromImage(thumbBMP);
        // Set the properties for the new graphic file
        oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

        // Draw the new graphic based on the resized bitmap
        oGraphics.DrawImage(originalBMP, 0, 0, thumbWidth, thumbHeight);

        Bitmap newBitmap = new Bitmap(thumbBMP);
        thumbBMP.Dispose();
        thumbBMP = null;

        // Save the new graphic file to the server
        newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);

        oGraphics = Graphics.FromImage(bannerBMP);
        // Set the properties for the new graphic file
        oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

        // Draw the new graphic based on the resized bitmap
        oGraphics.DrawImage(originalBMP, 0, 0, bannerWidth, bannerHeight);
        // Save the new graphic file to the server
        bannerBMP.Save("~/image/" + objPropBannerImage.ImageId + ".jpg");


        // Once finished with the bitmap objects, we deallocate them.
        originalBMP.Dispose();

        bannerBMP.Dispose();
        oGraphics.Dispose();
    }
44
demandé sur Cœur 2013-04-07 17:18:08

13 réponses

Lorsqu'un objet Bitmap ou un objet Image est construit à partir d'un fichier, le fichier reste verrouillé pendant la durée de vie de l'objet. En tant que résultat, vous ne pouvez pas changer une image et la sauvegarder dans le même fichier d'où il provient. http://support.microsoft.com/?id=814675

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

de l'Image.Enregistrer.(.) lance une exception GDI+ parce que le flux de mémoire est fermé

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

EDIT:

juste l'écriture de la mémoire...

enregistrer pour un "intermédiaire" flux de mémoire, qui doit travailler

p.ex. essayez celui - remplacer

    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);
    }
}
73
répondu NSGaga 2017-05-23 12:26:36

ce message d'erreur s'affiche également si le chemin que vous avez passé à Bitmap.Save() n'est pas valide (le dossier n'existe pas, etc.).

32
répondu Reg Edit 2014-05-16 13:06:09
    // Once finished with the bitmap objects, we deallocate them.
    originalBMP.Dispose();

    bannerBMP.Dispose();
    oGraphics.Dispose();

C'est un style de programmation que vous regretterez tôt ou tard. Plus tôt frappe à la porte, vous avez oublié un. Vous ne disposez pas de newBitmap . Qui garde un verrou sur le fichier jusqu'à ce que le collecteur d'ordures fonctionne. S'il ne s'exécute pas alors la deuxième fois que vous essayez de sauver dans le même fichier, vous obtiendrez le klaboom. GDI+ exceptions sont trop misérables pour donner un bon diagnostic si grave décapitation s'ensuit. Au-delà des milliers de googlables articles qui mentionnent cette erreur.

toujours faveur en utilisant le en utilisant déclaration. Qui n'oublie jamais de disposer d'un objet, même si le code fait une exception.

using (var newBitmap = new Bitmap(thumbBMP)) {
    newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);
}

bien qu'il soit très difficile de savoir pourquoi vous créez même un nouveau bitmap, sauvegarder thumbBMP devrait déjà être suffisant. Bref, donnez le reste de vos objets jetables de la même façon en utilisant l'amour.

8
répondu Hans Passant 2013-04-07 14:04:51

Vérifiez la permission de votre dossier où l'image est sauvegardée Clic droit sur le dossier puis allez:

Propriétés > Sécurité > Modifier > Ajouter-- Sélectionner "tout le monde" et vérifier Autoriser" contrôle total "

6
répondu Asad 2015-12-03 14:22:25

dans mon cas le fichier image bitmap existait déjà dans le lecteur de système , donc mon application a lancé l'erreur " une erreur générique s'est produite dans GDI+ " .

  1. vérifier que le dossier de destination existe
  2. vérifier qu'il n'y a pas déjà un fichier avec le même nom dans le dossier de destination
5
répondu Palani Kumar 2017-03-21 18:37:31

je faisais face à la même question une erreur générique s'est produite dans GDI+ sur la sauvegarde tout en travaillant sur l'application MVC, je recevais cette erreur parce que j'écrivais le mauvais chemin pour sauver l'image, I chemin de sauvegarde corrigé et il a fonctionné très bien pour moi.

img1.Save(Server.MapPath("/Upload/test.png", System.Drawing.Imaging.ImageFormat.Png);
3
répondu Anjan Kant 2016-01-14 07:21:21

j'ai toujours vérifier/tester ces:

  • est-ce que le chemin + nom de fichier contient des caractères illégaux pour le système de fichiers donné?
  • le fichier existe déjà? La (mauvaise)
  • le chemin existe-t-il déjà? (Bon)
  • si le chemin est relatif: est-ce que je l'attends dans le bon répertoire parent (surtout bin/Debug ; -))?
  • est le chemin accessible en écriture pour le programme et quel utilisateur le fait exécuter? (Services peut être difficile ici!)
  • est-ce que le chemin complet ne contient vraiment pas de chars illégaux? (certains caractères unicode sont presque invisibles)

je n'ai jamais eu de problèmes avec Bitmap.Save() en dehors de cette liste.

1
répondu Xan-Kun Clark-Davis 2017-03-21 04:40:25

Je l'ai obtenu travaillant en utilisant FileStream, obtenir de l'aide de ces

http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.html http://csharpdotnetfreak.blogspot.com/2010/02/resize-image-upload-ms-sql-database.html

System.Drawing.Image imageToBeResized = System.Drawing.Image.FromStream(fuImage.PostedFile.InputStream);
        int imageHeight = imageToBeResized.Height;
        int imageWidth = imageToBeResized.Width;
        int maxHeight = 240;
        int maxWidth = 320;
        imageHeight = (imageHeight * maxWidth) / imageWidth;
        imageWidth = maxWidth;

        if (imageHeight > maxHeight)
        {
            imageWidth = (imageWidth * maxHeight) / imageHeight;
            imageHeight = maxHeight;
        }

        Bitmap bitmap = new Bitmap(imageToBeResized, imageWidth, imageHeight);
        System.IO.MemoryStream stream = new MemoryStream();
        bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
        stream.Position = 0;
        byte[] image = new byte[stream.Length + 1];
        stream.Read(image, 0, image.Length);
        System.IO.FileStream fs
= new System.IO.FileStream(Server.MapPath("~/image/a.jpg"), System.IO.FileMode.Create
, System.IO.FileAccess.ReadWrite);
            fs.Write(image, 0, image.Length);
0
répondu donstack 2013-04-07 14:53:18

créer le chemin du dossier image / pouces sur votre disque dur = > Problème résolu!

0
répondu Chưa biết 2014-07-24 16:50:21

Pour moi, c'était un problème de permission. Quelqu'un a retiré les permissions d'écriture sur le dossier pour le compte d'utilisateur sous lequel l'application était en cours d'exécution.

0
répondu Jenny O'Reilly 2014-11-17 09:18:34
    I used below logic while saving a .png format. This is to ensure the file is already existing or not.. if exist then saving it by adding 1 in the filename

Bitmap btImage = new Bitmap("D:\Oldfoldername\filename.png");
    string path="D:\Newfoldername\filename.png";
            int Count=0;
                if (System.IO.File.Exists(path))
                {
                    do
                    {
                        path = "D:\Newfoldername\filename"+"_"+ ++Count + ".png";                    
                    } while (System.IO.File.Exists(path));
                }

                btImage.Save(path, System.Drawing.Imaging.ImageFormat.Png);
0
répondu Balaji Dinakaran 2016-06-16 14:00:38

j'ai rencontré cette erreur en essayant de convertir des images Tiff en Jpeg. Pour moi, le problème provenait de l'tiff dimensions trop grandes. Quelque chose jusqu'à environ 62000 pixels était bien, quelque chose au-dessus de cette taille a produit l'erreur.

0
répondu RichTea88 2016-10-20 08:59:04

pour moi c'était un problème de chemin lors de la sauvegarde de l'image.

int count = Directory.EnumerateFiles(System.Web.HttpContext.Current.Server.MapPath("~/images/savedimages"), "*").Count();

var img = Base64ToImage(imgRaw);

string path = "images/savedimages/upImages" + (count + 1) + ".png";

img.Save(Path.Combine(System.Web.HttpContext.Current.Server.MapPath(path)));

return path;

donc je l'ai fixé en ajoutant la barre oblique suivante

String path = "images/savedimages....

devrait être

String path = "/images/savedimages....

Espère que ça aide quelqu'un coincé!

0
répondu imBlue 2018-01-10 16:46:37