J'utilise le bloc de code suivant avec un peu plus de code à l'intérieur du bloc using:
using (System.Drawing.Bitmap tempImg =
(System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap))
{
// ...
tempImg.Save("..\\..\\testdata\\tempImg.bmp", ImageFormat.Bmp);
// ...
}
Mais j'obtiens toujours l'erreur:
Une erreur générique s'est produite à GDI +
seulement après avoir effectué une action qui n’est pas liée au code contenu dans le bloc using. Dans d'autres cas, cela fonctionne bien ..__ également. Le fichier tempImg.bmp étant un fichier temporaire, je supprime le fichier tempImg.bmp du bloc using.
Puisque le tempImg est à l'intérieur de l'utilisation et que c'est disposé, je pense que le problème du verrouillage devrait être résolu.
Quelqu'un peut-il s'il vous plaît laissez-moi savoir quelle est l'erreur dans ce code?
Éditez: System.Drawing.Image
à System.Drawing.Bitmap
en tant que type de tempImg
.
Edit: J'ai identifié cette erreur uniquement après la création de SaveFileDialog et le clic de l'utilisateur sur "Enregistrer".
Enfin, je pouvais trouver ce qui n'allait pas dans mon code et je voudrais le mentionner ici, car je pense que cela pourrait être utile à quelqu'un ...
Comme j'ai donné un chemin relatif dans tempImg.Save, et après que l'utilisateur ait cliqué sur "Enregistrer" dans SaveFileDialog, le chemin actuel de tempImg.Save devient:
Chemin spécifié par SaveFileDialog + le chemin relatif
automatiquement.
Ainsi, si le chemin n'existe pas, cette erreur se produit.
Merci à tous pour les réponses.
J'ai également eu une fois ce problème - cela se produit parce que le bitmap est verrouillé et que vous ne pouvez pas l'enregistrer (si vous voulez, je peux trouver l'explication exacte), de toute façon une solution est la suivante: bitmap d'origine que vous avez copié le bitmap d'origine dans le nouveau bitmap créé, puis disposez le bitmap d'origine et enregistrez le nouveau.
Bitmap bm3 = new Bitmap(bm2);
Et puis enregistrez.
Cela indique généralement que quelque chose d'autre, potentiellement un autre thread dans votre propre application, a déjà verrouillé le fichier cible que vous essayez de sauvegarder au niveau du système de fichiers. Si vous regardez l'exception intérieure, je pense qu'il devrait en être fait mention. Si ce n’est pas directement dans l’exception InnerException Une autre façon de le confirmer (ou de découvrir ce que cela pourrait être réellement) est d’activer les exceptions de la première chance dans le débogueur et de regarder quelle exception est lancée "sous", puis sauvegardée puis transformée en cette exception exception générique.
J'ai essayé toutes les solutions données ici, mais en vain. Trouvé la solution finalement.
g.dispose();
System.IO.Directory.Exists(dir);
Est-ce une application ASP.NET?
Une erreur générique s'est produite au niveau de GDI + dans asp.net, principalement en raison de l'absence des autorisations d'accès au dossier cible.
De plus, votre code pourrait être simplifié pour:
using (Image image= dataObject.GetImage())
{
if (image != null)
{
image.Save("test.bmp");
}
}
Dans mon cas, c’était une application ASP.NET dans laquelle je remplaçais une seule DLL et je devais simplement redémarrer le pool d’applications après le déploiement. Ensuite, cela a bien fonctionné.
Une erreur générique se produit au niveau de GDI + sur Bitmap.Save () est généralement reçue lorsque le dossier est protégé ou que le nom du fichier n'est pas valide.
Une erreur courante consiste à oublier de créer un nom et d'écrire simplement le nom du dossier.
Éliminez votre objet bitMap
après l'enregistrement de l'image:
bitMap.Dispose()
oimg.Dispose()
bitMap = Nothing
oimg = Nothing
Je faisais face au même problème en remplaçant le type d'image ".bmp" par ".png".
Ceci est un exemple de code provenant 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();
}
J'essaie de sauvegarder l'image d'une ressource et cela me donne aussi l'erreur GDI lorsque j'utilise directement la méthode Bitmap.Save (chemin du fichier) . Je pense que nous pouvons utiliser le même code ci-dessous pour toute autre image bitmap le cloner.
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();
}
Dans mon cas, j’enregistrais le fichier bitmap au même emplacement que la source, C’est le problème qui se pose . J'enregistre le bitmap dans le nouvel emplacement et tout va bien maintenant.