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

326

Cela semble être une erreur infâme sur tout le Web. À tel point que je n'ai pas pu trouver de réponse à mon problème car mon scénario ne convient pas. Une exception est levée lorsque j'enregistre l'image dans le flux.

Bizarrement, cela fonctionne parfaitement avec un png mais donne l'erreur ci-dessus avec jpg et gif, ce qui est assez déroutant.

Le problème le plus similaire concerne l'enregistrement d'images dans des fichiers sans autorisations. Ironiquement, la solution consiste à utiliser un flux de mémoire comme je le fais ....

public static byte[] ConvertImageToByteArray(Image imageToConvert)
{
    using (var ms = new MemoryStream())
    {
        ImageFormat format;
        switch (imageToConvert.MimeType())
        {
            case "image/png":
                format = ImageFormat.Png;
                break;
            case "image/gif":
                format = ImageFormat.Gif;
                break;
            default:
                format = ImageFormat.Jpeg;
                break;
        }

        imageToConvert.Save(ms, format);
        return ms.ToArray();
    }
}

Plus de détails à l'exception. La raison pour laquelle cela cause tant de problèmes est le manque d'explication :(

System.Runtime.InteropServices.ExternalException was unhandled by user code
Message="A generic error occurred in GDI+."
Source="System.Drawing"
ErrorCode=-2147467259
StackTrace:
   at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters    encoderParams)
   at System.Drawing.Image.Save(Stream stream, ImageFormat format)
   at Caldoo.Infrastructure.PhotoEditor.ConvertImageToByteArray(Image imageToConvert) in C:\Users\Ian\SVN\Caldoo\Caldoo.Coordinator\PhotoEditor.cs:line 139
   at Caldoo.Web.Controllers.PictureController.Croppable() in C:\Users\Ian\SVN\Caldoo\Caldoo.Web\Controllers\PictureController.cs:line 132
   at lambda_method(ExecutionScope , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
 InnerException: 

OK les choses que j'ai essayées jusqu'à présent.

  1. Cloner l'image et travailler dessus.
  2. Récupérer l'encodeur pour ce MIME en le passant avec le paramètre de qualité jpeg.
madcapnmckay
la source
en relation: stackoverflow.com/questions/4671449/…
Patrick Szalapski
3
Pour moi, le problème était que le dossier n'existait pas. Corrigé en créant simplement le dossier.
hazjack
Pour moi, c'était un indice hors de portée qui était avalé.
Billy Jake O'Connor

Réponses:

189

OK, je semble avoir trouvé la cause juste par pure chance et ce n'est rien de mal avec cette méthode particulière, c'est plus loin dans la pile des appels.

Plus tôt, je redimensionne l'image et dans le cadre de cette méthode, je retourne l'objet redimensionné comme suit. J'ai inséré deux appels à la méthode ci-dessus et une sauvegarde directe dans un fichier.

// At this point the new bitmap has no MimeType
// Need to output to memory stream
using (var m = new MemoryStream())
{
       dst.Save(m, format);

       var img = Image.FromStream(m);

       //TEST
       img.Save("C:\\test.jpg");
       var bytes = PhotoEditor.ConvertImageToByteArray(img);


       return img;
 }

Il semble que le flux de mémoire sur lequel l'objet a été créé doit être ouvert au moment où l'objet est enregistré. Je ne sais pas pourquoi c'est. Est-ce que quelqu'un peut m'éclairer et comment je peux contourner cela.

Je reviens uniquement d'un flux car après avoir utilisé le code de redimensionnement similaire à celui-ci, le fichier de destination a un type MIME inconnu (img.RawFormat.Guid) et un ID comme le type MIME pour être correct sur tous les objets image car il rend difficile l'écriture générique gérer le code autrement.

ÉDITER

Cela n'est pas venu dans ma recherche initiale, mais voici la réponse de Jon Skeet

madcapnmckay
la source
4
Je ne savais pas que lorsque vous obtenez une bitmap d'un flux mémoire, vous ne devez pas fermer le flux. très utile, merci
mcdon
38
Je vous remercie. Cela a probablement sauvé le dernier de mes cheveux.
NotMe
6
Merci! cela m'a fait gagner beaucoup de temps, une chose cependant, cela vous dérangerait-il de souligner la cause de l'erreur au début de votre réponse, car je (et je suppose que la plupart des faucons) l'ont raté sur le survol original à travers les réponses, peut-être quelque chose comme " NE FERMEZ PAS LE FLUX DE MÉMOIRE SI VOUS AVEZ L'INTENTION D'UTILISER L'IMAGE ENCORE "serait génial; D
DorD
6
Quelle est votre variable "dst"?
WEFX
1
@madcapnmckay, veuillez expliquer ce qu'est la variable 'dst' et sa signification
Mike T
131

Si vous obtenez cette erreur, je peux dire que votre application ne dispose pas d'une autorisation d'écriture sur certains répertoires.

Par exemple, si vous essayez d'enregistrer l'image du flux de mémoire dans le système de fichiers, vous pouvez obtenir cette erreur.

S'il vous plaît si vous utilisez XP, assurez-vous d'ajouter une autorisation d'écriture pour le compte aspnet sur ce dossier.

Si vous utilisez un serveur Windows (2003,2008) ou Vista, assurez-vous d'ajouter une autorisation d'écriture pour le compte de service réseau.

J'espère que cela aidera quelqu'un.

Savindra
la source
7
Tu ne l'as pas fait! J'ai perdu 2 heures avec les fichues permissions d'écriture ... Je suis venu ici pour poster ceci. J'espère que vous obtiendrez plus de votes positifs. :)
Gleno
2
C'ÉTAIT la solution pour moi. +1 totalement!
Grandizer
5
Vous pouvez faire File.WriteAllText ("filename.jpg", "") puis File.DeleteFile ("filename.jpg") avant d'enregistrer le bitmap. Dans mon benmark, cela ne prend que 0,001 secondes et vous obtenez un bon 'Vous n'avez pas la permission d'enregistrer le nom de fichier.jpg'
Despertar
@Despertar Vous voulez dire File.Delete (), mais c'est une astuce très pratique! Je vais certainement l'utiliser à chaque fois que j'enregistre une image bitmap.
D Coetzee
2
Dans mon cas, le répertoire n'existait pas.
message silencieux
54

J'ajouterai également cette cause de l'erreur dans l'espoir que cela aide un futur voyageur sur Internet. :)

GDI + limite la hauteur maximale d'une image à 65500

Nous effectuons un redimensionnement d'image de base, mais en redimensionnant, nous essayons de maintenir le rapport hauteur / largeur. Nous avons un gars QA qui est un peu trop bon dans ce travail; il a décidé de tester cela avec une photo d'un pixel de large qui mesurait 480 pixels. Lorsque l'image a été mise à l'échelle pour correspondre à nos dimensions, la hauteur était au nord de 68 000 pixels et notre application a explosé A generic error occurred in GDI+.

Vous pouvez le vérifier vous-même avec test:

  int width = 480;
  var height = UInt16.MaxValue - 36; //succeeds at 65499, 65500
  try
  {
    while(true)
    {
      var image = new Bitmap(width, height);
      using(MemoryStream ms = new MemoryStream())
      {
        //error will throw from here
        image.Save(ms, ImageFormat.Jpeg);
      }
      height += 1;
    }
  }
  catch(Exception ex)
  {
    //explodes at 65501 with "A generic error occurred in GDI+."
  }

C'est dommage qu'il n'y ait pas de .net amical ArgumentExceptionjeté dans le constructeur de Bitmap.

Fred
la source
17
Merci - ce voyageur temporel sur Internet vous est très reconnaissant d'avoir laissé ce message.
Tom West
D'après mes tests, 65535 est en fait la valeur maximale. Au 65536, je commence à voir l'erreur générique.
ChaseMedallion
Je viens de réessayer: Win10 .net 4.5 et .net 4.6.1, et il a explosé à 65501, ce qui semble encore plus aléatoire. Le code est également rempli d'erreurs de syntaxe, sera mis à jour :)
Fred
37

Cet article explique en détail ce qui se passe exactement: dépendances du constructeur de bitmap et d'image

En bref, pendant toute la durée de vie d'un Imageconstruit à partir d'un ruisseau , le ruisseau ne doit pas être détruit.

Donc, au lieu de

using (var strm = new ... )  {
    myImage = Image.FromStream(strm);
}

essaye ça

Stream imageStream;
...

    imageStream = new ...;
    myImage = Image.FromStream(strm);

et fermez imageStream à la fermeture du formulaire ou à la fermeture de la page Web.

Ivan Mesic
la source
Ouais celui-ci m'a eu. J'étais consciencieux et j'ai enveloppé mon flux dans un fichier et j'ai usingensuite essayé de copier l'image dans un flux mémoire et j'ai reçu le redoutable message "Erreur générique dans GDI +".
Will Appleby
Votre lien me donnait des redirections infinies; celui-ci fonctionne. J'avais un problème d'économie PixelFormat.Format32bppArgbmais pas PixelFormat.Format1bppIndexed. L'article que vous avez lié explique pourquoi: GDI + peut choisir de re-décoder les données bitmap du flux source plutôt que de tout garder en mémoire. Je suppose qu'il ne re-décode pas les images 1bpp.
labreuer
Même le nouveau lien ne fonctionne plus. Une simple recherche sur Google n'a pas semblé révéler la bonne page. Mais j'étais très content de trouver cette réponse! Ma
solution de
28

Vous obtiendrez également cette exception si vous essayez d'enregistrer sur un chemin non valide ou s'il y a un problème d'autorisations.

Si vous n'êtes pas sûr à 100% que le chemin du fichier est disponible et que les autorisations sont correctes, essayez d'écrire un dans un fichier texte. Cela ne prend que quelques secondes pour exclure ce qui serait une solution très simple.

var img = System.Drawing.Image.FromStream(incomingStream);

// img.Save(path);
System.IO.File.WriteAllText(path, "Testing valid path & permissions.");

Et n'oubliez pas de nettoyer votre fichier.

Kirk Broadhurst
la source
C'était le problème pour moi ... Je souhaite que l'erreur soit moins vague, cela m'aurait fait gagner beaucoup de temps.
Oofpez
Oui! Le dossier dans lequel vous enregistrez doit exister. Je fais d'abord une vérification pour cela avant d'essayer d'enregistrer une image. (Pourtant, l'erreur me rattrape, environ une fois par an.)
Magnus Smith
Mon chemin était un répertoire, au lieu d'un fichier.
Asen Kasimov
20

Enregistrer l'image dans une variable bitmap

using (var ms = new MemoryStream())
{
    Bitmap bmp = new Bitmap(imageToConvert);
    bmp.Save(ms, format);
    return ms.ToArray();
}
Amir Atashin
la source
Cela a résolu mon problème. Pourriez-vous expliquer pourquoi l'enregistrement de l'image sur Bitmap fait fuir l'exception?
jmc
J'ai sauvé ma journée .. je ne sais pas ce qui a causé le problème, mais l'enregistrement Bitmap fonctionne .. System.Drawing.Image ne sera pas enregistré dans le flux de mémoire mais Bitmap le fait !!!
San
C'était la meilleure solution pour moi. Création d'un nouveau bitmap et conversion à partir de celui-ci.
uzay95
17

Juste au cas où quelqu'un ferait des trucs aussi stupides que moi. 1. assurez-vous que le chemin existe. 2. assurez-vous que vous disposez des autorisations pour écrire. 3. assurez-vous que votre chemin est correct, dans mon cas, il me manquait un nom de fichier dans TargetPath :(

il aurait dû dire, votre chemin est nul que "Une erreur générique s'est produite dans GDI +"

ahsant
la source
16

J'ai également eu cette erreur lors de l'enregistrement des fichiers JPEG, mais uniquement pour certaines images.

Mon code final:

  try
  {
    img.SaveJpeg(tmpFile, quality); // This is always successful for say image1.jpg, but always throws the GDI+ exception for image2.jpg
  }
  catch (Exception ex)
  {
    // Try HU's method: Convert it to a Bitmap first
    img = new Bitmap(img); 
    img.SaveJpeg(tmpFile, quality); // This is always successful
  }

Je n'ai pas créé les images donc je ne peux pas dire quelle est la différence.
J'apprécierais que quelqu'un puisse expliquer cela.

Ceci est ma fonction SaveJpeg juste pour info:

private static void SaveJpeg(this Image img, string filename, int quality)
{
  EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, (long)quality);
  ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
  EncoderParameters encoderParams = new EncoderParameters(1);
  encoderParams.Param[0] = qualityParam;
  img.Save(filename, jpegCodec, encoderParams);
}

private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
    var encoders = ImageCodecInfo.GetImageEncoders();
    var encoder = encoders.SingleOrDefault(c => string.Equals(c.MimeType, mimeType, StringComparison.InvariantCultureIgnoreCase));
    if (encoder == null) throw new Exception($"Encoder not found for mime type {mimeType}");
    return encoder;
}
Aximili
la source
1
Cela a résolu les jours de traction des cheveux. C'est le code le plus wtf que je pense avoir jamais écrit :)
Jeff Dunlop
13

J'ai trouvé que si l'un des dossiers parents où j'enregistrais le fichier avait un espace de fin, alors GDI + lèverait l'exception générique.

En d'autres termes, si j'ai essayé d'enregistrer dans "C: \ Documents and Settings \ myusername \ Local Settings \ Temp \ ABC DEF M1 Trended Values ​​\ Images \ picture.png", alors il a levé l'exception générique.

Le nom de mon dossier était généré à partir d'un nom de fichier qui avait un espace de fin, il était donc facile de .Trim () et de passer à autre chose.

Igilima
la source
3
génial - je n'aurais jamais pensé à regarder de près le chemin du répertoire
jharr100
11

si votre code est le suivant, cette erreur se produit également

private Image GetImage(byte[] byteArray)
{
   using (var stream = new MemoryStream(byteArray))
   {
       return Image.FromStream(stream);
    }
}

La bonne est

private Image GetImage(byte[] byteArray)
{
   var stream = new MemoryStream(byteArray))
   return Image.FromStream(stream);        
}

Cela peut être dû au fait que nous revenons du bloc using

dhinesh
la source
pour moi, c'était le retour dans le bloc d'utilisation. J'utilise toujours using mais je renvoie la valeur en dehors du bloc. Merci!
Dragouf
1
J'ai découvert "à la dure" que si vous enregistrez à nouveau cette image dans un nouveau flux (comme HttpContext.Response.OutputStream par exemple), vous devrez également faire un stream.Flush (), sinon l'erreur se produit encore.
Lucian
11

Il s'agit d'une extension / qualification de la réponse de Fred qui a déclaré: "GDI limite la hauteur d'une image à 65534". Nous avons rencontré ce problème avec l'une de nos applications .NET, et après avoir vu le message, notre équipe d'impartition a levé la main en l'air et a déclaré qu'elle ne pouvait pas résoudre le problème sans changements majeurs.

Sur la base de mes tests, il est possible de créer / manipuler des images avec une hauteur supérieure à 65534, mais le problème se pose lors de l'enregistrement dans un flux ou un fichier DANS CERTAINS FORMATS . Dans le code suivant, l'appel de la méthode t.Save () lève notre ami l'exception générique lorsque la hauteur de pixel est 65501 pour moi. Pour des raisons de curiosité, j'ai répété le test de largeur, et la même limite s'appliquait à l'épargne.

    for (int i = 65498; i <= 100000; i++)
    {
        using (Bitmap t = new Bitmap(800, i))
        using (Graphics gBmp = Graphics.FromImage(t))
        {
            Color green = Color.FromArgb(0x40, 0, 0xff, 0);
            using (Brush greenBrush = new SolidBrush(green))
            {
                // draw a green rectangle to the bitmap in memory
                gBmp.FillRectangle(greenBrush, 0, 0, 799, i);
                if (File.Exists("c:\\temp\\i.jpg"))
                {
                    File.Delete("c:\\temp\\i.jpg");
                }
                t.Save("c:\\temp\\i.jpg", ImageFormat.Jpeg);
            }
        }
        GC.Collect();
    }

La même erreur se produit également si vous écrivez dans un flux de mémoire.

Pour contourner ce problème, vous pouvez répéter le code ci-dessus et remplacer ImageFormat.Tiff ou ImageFormat.Bmp par ImageFormat.Jpeg.

Cela va jusqu'à des hauteurs / largeurs de 100 000 pour moi - je n'ai pas testé les limites. En l'occurrence, Tiff était une option viable pour nous.

ÊTRE AVERTI

Les flux / fichiers TIFF en mémoire consomment plus de mémoire que leurs homologues JPG.

vipes
la source
10

A eu un problème très similaire et a également essayé de cloner l'image qui ne fonctionne pas. J'ai trouvé que la meilleure solution était de créer un nouvel objet Bitmap à partir de l'image chargée à partir du flux mémoire. De cette façon, le flux peut être éliminé, par exemple

using (var m = new MemoryStream())
{
    var img = new Bitmap(Image.FromStream(m));
    return img;
}

J'espère que cela t'aides.

HU.
la source
6

Une erreur s'est produite en raison d'une autorisation. assurez-vous que le dossier a TOUTE LA PERMISSION.

public Image Base64ToImage(string base64String)
    {
        // Convert Base64 String to byte[]
        byte[] imageBytes = Convert.FromBase64String(base64String);
        MemoryStream ms = new MemoryStream(imageBytes, 0,
          imageBytes.Length);

        // Convert byte[] to Image
        ms.Write(imageBytes, 0, imageBytes.Length);
        Image image = Image.FromStream(ms, true);
        return image;
    }

 img.Save("YOUR PATH TO SAVE IMAGE")
Gaurang s
la source
Je suis d'accord avec toi. J'ai résolu ce problème avec PERMISSION
praguan
5

RESOLU - J'ai eu ce problème exact. Le correctif, pour moi, était d'augmenter le quota de disque pour IUSR sur le serveur IIS. Dans ce cas, nous avons une application de catalogue avec des images d'articles et autres. Le quota de téléchargement pour l '"utilisateur Web anonyme" a été défini sur 100 Mo, ce qui est la valeur par défaut pour les serveurs IIS de cette société d'hébergement particulière. Je l'ai augmenté à 400 Mo et j'ai pu télécharger des images sans erreur.

Ce n'est peut-être pas votre problème, mais si c'est le cas, c'est une solution facile.

Marco
la source
4

Dans mon cas, le problème était dans le chemin que je sauvegardais (la racine C:\). Le changer pour D:\111\faire disparaître l'exception.

Ani
la source
4

Une autre cause de cette erreur - le chemin que vous indiquez dans la méthode Save de l'instance Bitmap n'existe pas ou vous n'avez pas fourni de chemin complet / valide.

Juste eu cette erreur parce que je passais un nom de fichier et non un chemin complet!

Ça arrive!

MytyMyky
la source
4

Mon tour!

using (System.Drawing.Image img = Bitmap.FromFile(fileName))
{
      ... do some manipulation of img ...
      img.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
}

Je l'ai sur le .Save ... parce que l'utilisation de () maintient le fichier ouvert, donc je ne peux pas l'écraser. Peut-être que cela aidera quelqu'un à l'avenir.

Andy
la source
4

Même problème auquel j'étais confronté. Mais dans mon cas, j'essayais d'enregistrer le fichier dans le lecteur C et il n'était pas accessible. J'ai donc essayé de l'enregistrer dans le lecteur D qui était entièrement accessible et j'ai réussi.

Vérifiez donc d'abord vos dossiers dans lesquels vous essayez d'enregistrer. Vous devez avoir tous les droits (lecture et écriture) pour ce dossier particulier.

Jaimin
la source
car normalement c ne permet pas sans l'autorisation de l'administrateur.
Aneeq Azam Khan
2

Je remarque que votre cas "jpeg" est en fait:

            default:
                format = ImageFormat.Jpeg;
                break;

Êtes-vous sûr que le format est jpeg et pas autre chose?

J'essaierais:

            case "image/jpg": // or "image/jpeg" !
                format = ImageFormat.Jpeg;
                break;

Ou vérifiez quoi imageToConvert.MimeType() revient réellement.

METTRE À JOUR

Y a-t-il une autre initialisation que vous devez faire à l'objet MemoryStream?

ChrisF
la source
Merci. Il est définitivement appelé avec le bon format. Je charge un jpg, débogue et confirme que le mime est reconnu comme image / jpeg et que le format est JPG.
madcapnmckay
3
Oh bien - j'essaie toujours d'éliminer d'abord l'évidence. Je ne peux pas compter le nombre de fois où je n'ai pas fait ça et ça me revient plus tard.
ChrisF
2
  • J'ai eu ce problème sur un serveur de test mais pas sur le serveur en direct.
  • J'écrivais l'image dans un flux, donc ce n'était pas un problème de permission.
  • J'avais déployé directement certains fichiers .dll sur le serveur de test.
  • Le déploiement de la solution entière a résolu le problème, il s'agissait donc probablement d'un décalage de compilation étrange
Chris Halcrow
la source
2

Juste pour jeter une autre solution possible sur la pile, je mentionnerai le cas dans lequel je suis tombé sur ce message d'erreur. La méthode Bitmap.Savelèverait cette exception lors de l'enregistrement d'une image bitmap que j'avais transformée et que j'affichais. J'ai découvert qu'il ne lèverait pas l'exception si la déclaration avait un point d'arrêt dessus, pas plus que si Bitmap.Savec'était précédé, Thread.Sleep(500)donc je suppose qu'il y a une sorte de conflit de ressources en cours.

Il suffit de copier l'image dans un nouvel objet Bitmap pour empêcher cette exception d'apparaître:

new Bitmap(oldbitmap).Save(filename);
Segfault
la source
2

Nous avons rencontré un problème similaire lors de la génération d'une PDFimage ou d' un redimensionnement à l'aide de la bibliothèque ImageProcessor sur le serveur de production.

Recyclez le pool d'applications pour résoudre le problème.

tech-gayan
la source
1

Si vous essayez d'enregistrer une image dans un emplacement distant, assurez-vous d'ajouter le NETWORK_SERVICEcompte d'utilisateur dans les paramètres de sécurité et accordez à cet utilisateur des autorisations de lecture et d'écriture. Sinon, cela ne fonctionnera pas.

JAH
la source
1
byte[] bts = (byte[])page1.EnhMetaFileBits; 
using (var ms = new MemoryStream(bts)) 
{ 
    var image = System.Drawing.Image.FromStream(ms); 
    System.Drawing.Image img = image.GetThumbnailImage(200, 260, null, IntPtr.Zero);      
    img.Save(NewPath, System.Drawing.Imaging.ImageFormat.Png);
}
jeka
la source
1

Simple, créer une nouvelle instance de Bitmap résout le problème.

string imagePath = Path.Combine(Environment.CurrentDirectory, $"Bhatti{i}.png");
Bitmap bitmap = new Bitmap(image);
bitmap.Save(imagePath);
Hassan Rahman
la source
0

Pour moi, j'utilisais le Image.Save(Stream, ImageCodecInfo, EncoderParameters)et apparemment, cela causait la tristement célèbre A generic error occurred in GDI+erreur.

J'essayais d'utiliser EncoderParameterpour enregistrer les fichiers JPEG en qualité 100%. Cela fonctionnait parfaitement sur "ma machine" (doh!) Et non sur la production.

Quand j'ai utilisé le à la Image.Save(Stream, ImageFormat)place, l'erreur a disparu! Donc, comme un idiot, j'ai continué à utiliser ce dernier bien qu'il les enregistre en qualité par défaut qui, je suppose, n'est que de 50%.

J'espère que cette information aide quelqu'un.

Ε Г И І И О
la source
0

J'ai aussi rencontré le problème. Le problème était dû à l'élimination du flux de chargement. Mais je ne l'ai pas éliminé, c'était à l'intérieur du framework .Net. Il ne me restait plus qu'à utiliser:

image_instance = Image.FromFile(file_name);

au lieu de

image_instance.Load(file_name);

image_instance est de type System.Windows.Forms.PictureBox! Load () de PictureBox dispose du flux à partir duquel l'image a été chargée, et je ne le savais pas.

Klaus
la source
0

Sur la base de la réponse de @savindra, si vous RHM sur votre application et essayez d'exécuter en tant que qu'administrateur, cela devrait résoudre votre problème.

Le mien semblait être un problème de permission.

AltF4_
la source
0

Les problèmes possibles qui provoquent une telle erreur sont:

  1. Le répertoire n'existe pas (la méthode que vous appelez ne créera pas automatiquement ce répertoire pour vous)
  2. Les autorisations de sécurité pour écrire dans le répertoire de sortie ne permettent pas à l'utilisateur exécutant l'application d'écrire

J'espère que cela aide, c'était le correctif de mon problème, je me suis simplement assuré que le répertoire de sortie existe avant d'enregistrer l'image de sortie!

Ihab Hajj
la source