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();
}
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);
}
}
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.).
// 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.
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 "
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+ " .
- vérifier que le dossier de destination existe
- vérifier qu'il n'y a pas déjà un fichier avec le même nom dans le dossier de destination
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);
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.
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);
créer le chemin du dossier image / pouces sur votre disque dur = > Problème résolu!
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.
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);
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.
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é!