82 votes

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

Je travaille sur le téléchargement et l'enregistrement d'une copie de l'image dans un dossier de vignettes.

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

provoque l'exception "Une erreur générique s'est produite dans GDI+".

J'ai essayé de donner l'autorisation sur le dossier, j'ai aussi essayé d'utiliser un nouvel objet bmp séparé lors de l'enregistrement.

Edita:

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

111voto

NSGaga Points 7386

Lorsqu'un objet Bitmap ou un objet Image i le fichier reste verrouillé pendant toute la durée de vie de l'objet. En conséquence, vous ne pouvez pas Par conséquent, vous ne pouvez pas modifier une image et la réenregistrer dans le même fichier où http://support.microsoft.com/?id=814675

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

Image.Save(..) lève une exception GDI+ car le flux de mémoire est fermé

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

EDIT :
j'écris de mémoire...

enregistrer dans un flux de mémoire "intermédiaire", cela devrait fonctionner

Par exemple, essayez celui-ci - remplacez

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

60voto

Reg Edit Points 3917

Ce message d'erreur s'affiche si le chemin d'accès que vous indiquez à l'option Bitmap.Save() est invalide (le dossier n'existe pas, etc.).

17voto

Hans Passant Points 475940
    // 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 en avez oublié un. Vous ne disposez pas newBitmap . Ce dernier garde un verrou sur le fichier jusqu'à ce que le ramasse-miettes s'exécute. S'il ne s'exécute pas, la deuxième fois que vous essayez d'enregistrer dans le même fichier, vous obtiendrez le klaboom. Les exceptions GDI+ sont trop misérables pour donner un bon diagnostic, ce qui entraîne une sérieuse prise de tête. Au-delà des milliers de posts googlables qui mentionnent cette erreur.

Toujours favoriser l'utilisation de la en utilisant déclaration. qui n'oublie jamais de se débarrasser d'un objet, même si le code lance une exception.

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

Bien que la raison pour laquelle vous créez un nouveau bitmap ne soit pas claire, la sauvegarde de thumbBMP devrait déjà être suffisante. Quoi qu'il en soit, donnez au reste de vos objets jetables le même amour de l'utilisation.

9voto

Palani Kumar Points 340

Dans mon cas le fichier image bitmap existait déjà dans le lecteur système Mon application génère donc l'erreur suivante "Une erreur générique s'est produite dans GDI+". .

  1. Vérifier que le dossier de destination existe
  2. Vérifiez qu'il n'existe pas déjà un fichier portant le même nom dans le dossier de destination.

6voto

Asad Points 319

Vérifiez les droits d'accès au dossier dans lequel l'image est enregistrée. Cliquez avec le bouton droit de la souris sur le dossier, puis allez à :

Propriétés > Sécurité > Modifier > Ajouter - sélectionnez "tout le monde" et cochez "Autoriser le contrôle total".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X