web-dev-qa-db-fra.com

Une erreur générique s'est produite dans GDI + à System.Drawing.Image.Save

Exception:

ne erreur générique s'est produite dans GDI +. À System.Drawing.Image.Save (nom de fichier de chaîne, encodeur ImageCodecInfo, EncoderParameters encoderParams) à System.Drawing.Image.Save (nom de fichier de chaîne, format ImageFormat) à System.Drawing.Image .Save (String filename)

Code:

byte[] bitmapData = new byte[imageText.Length];
MemoryStream streamBitmap;
bitmapData = Convert.FromBase64String(imageText);
streamBitmap = new MemoryStream(bitmapData);
System.Drawing.Image img = Image.FromStream(streamBitmap);
img.Save(path);

Nous convertissons une chaîne base64 en un MemoryStream et créons ensuite un System.Drawing.Image (Image.FromStream (streamBitmap)). À la fin, l'image est enregistrée dans un fichier temporaire.

Ce qui est étrange, c'est que le problème semble se produire lorsque l'activité (nombre d'utilisateurs simultanés) est élevée sur le serveur Web et que le problème est résolu temporairement après un IISRESET ou un recyclage du pool d'applications ...

==> Problème de garbage collector?

J'ai déjà vérifié l'autorisation du dossier TEMP ...

22
Razor

Lorsque vous chargez une image à partir d'un flux, vous devez garder le flux ouvert pendant toute la durée de vie de l'image, voir MSDN Image.FromStream .

Je pense que l'exception est due au fait que le flux de mémoire est fermé avant même que l'image ne soit éliminée. Vous pouvez changer votre code comme ceci

byte[] bitmapData = new byte[imageText.Length];
bitmapData = Convert.FromBase64String(imageText);

  using (var streamBitmap = new MemoryStream(bitmapData)
  {
      using (img = Image.FromStream(streamBitmap))
      { 
         img.Save(path);
      }
  }

Voici quelques liens vers des discussions sur des problèmes similaires

gdi + erreur d'enregistrement d'image à partir de la page Web

Lors du dessin d'une image: System.Runtime.InteropServices.ExternalException: une erreur générique s'est produite dans GDI

25

Assurez-vous que le chemin que vous avez spécifié est valide. En utilisant la réponse précédente (avec les utilisations sur le flux de mémoire), vous pouvez toujours obtenir cette erreur exacte "Erreur générique dans GDI +" si le chemin d'accès au fichier n'existe pas. Le fichier sera créé, le chemin du répertoire doit exister.

8
mminneman

J'ai rencontré le même message d'exception lors de l'enregistrement d'une image. Il s'est avéré que mon code était bien et faisait ce qu'il était censé faire.

Le problème était que le disque dur était plein, donc la nouvelle image n'a pas pu être créée. Je ne l'ai remarqué qu'en essayant d'enregistrer le projet sur lequel je travaillais, car il n'avait pas d'espace pour enregistrer.

2
Molay

Dans mon cas, l'extrait ci-dessous fonctionne bien où ConvertedImageString est la chaîne Base64Image reçue de l'API et je la convertis en une image associée avec un format et l'enregistre dans un dossier de fichiers physiques sur le serveur.

Edit: L'erreur ci-dessus se produit peut-être en raison d'un chemin de fichier incorrect sur lequel vous essayez d'enregistrer l'image

string converted = ConvertedImageString.Replace('-', '+');
converted = converted.Replace('_', '/');
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(ConvertedImageString)))
{
    using (Bitmap bm1 = new Bitmap(ms))
    {
        newFileName =  id + ".jpg";
        newFileName = CleanFileName(newFileName);
        newFileName = newFileName.Replace(" ", "_");

        Path = Path + newFileName;

        bm1.Save(Path, ImageFormat.Jpeg);
    }
}
2
Prashant Pimpale