Un générique erreur s'est produite dans GDI+, Image JPEG à MemoryStream
Ce qui semble être un peu une erreur infâme sur le web. Tant et si bien que j'ai été incapable de trouver une réponse à mon problème que mon scénario n'est pas adaptée. Une exception est lancé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 qui est plutôt déroutant.
Plus similaires problème là se rapportent à l'enregistrement des images dans des fichiers sans autorisations. Ironiquement, la solution est d'utiliser un flux de mémoire que je suis en train de faire....
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 en détail à l'exception. La raison de ce qui provoque beaucoup 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 choses que j'ai essayé jusqu'à présent.
- Le clonage de l'image et de travailler sur cela.
- De la récupération de l'encodeur pour que MIME passage qu'avec le format jpeg, le réglage de la qualité.
stackoverflow.com/questions/1053052/...
Pour moi, le problème était que le dossier n'existe pas. Résolu en créant le dossier.
Pour moi, c'était un indice en dehors de la plage d'obtenir d'ingestion.
OriginalL'auteur madcapnmckay | 2009-06-27
Vous devez vous connecter pour publier un commentaire.
OK je crois avoir trouvé la cause est juste par pure chance, et sa n'a rien de mal avec cette méthode, il est de retour en haut de la pile d'appel.
Plus tôt, j'ai redimensionner l'image et dans le cadre de cette méthode, que j'ai retourner le redimensionnement de l'objet comme suit. J'ai inséré deux appels à la méthode ci-dessus et l'enregistrer dans un fichier.
Il apparaît que le flux de mémoire que l'objet a été créé sur a à être ouvert au moment de l'objet est enregistré. Je ne suis pas sûr pourquoi. Quelqu'un est-il en mesure de m'éclairer et comment je peux contourner ce problème.
Je n'retour à partir d'un flux parce que, après l'aide de la redimensionner un code similaire à cette le fichier de destination est inconnu type mime (img.RawFormat.Guid) et Id comme le type Mime correct sur tous les objets de l'image comme c'est difficile d'écrire générique de code de traitement contraire.
MODIFIER
Ce n'est pas venu dans ma recherche initiale, mais voici la réponse de Jon Skeet
Je vous remercie. C'est probablement ce qui a sauvé le dernier de mes cheveux.
Merci! ce qui m'a sauvé beaucoup de temps, cependant, auriez-vous l'esprit en soulignant la cause de l'erreur au début de votre réponse que je (et je suppose que la plupart des falks) manqué sur l'origine écrémé à travers les réponses, peut-être quelque chose comme "NE PAS FERMER LE FLUX de MÉMOIRE SI VOUS avez l'INTENTION D'UTILISER à NOUVEAU L'IMAGE" serait génial ;D
Qu'est-ce que votre "heure d'été" variable?
expliquer ce qu'est le " dst " est une variable et sa signification
OriginalL'auteur madcapnmckay
Si vous obtenez cette erreur , alors je peux dire que votre candidature n'a pas la permission d'écriture sur un répertoire.
Par exemple, si vous essayez d'enregistrer l'Image à partir du flux de mémoire pour le système de fichiers , vous pouvez obtenir cette erreur.
S'il vous plaît si vous utilisez XP, assurez-vous d'ajouter l'autorisation d'écriture pour le compte aspnet sur ce dossier.
Si vous utilisez windows server (2003,2008) ou Vista, assurez-vous que ajouter l'autorisation d'écriture pour le compte service Réseau.
Espère que ça aidera certains.
Vous avez résolu mon problème! +1 pour vous!
CELA a été la solution pour moi. +1 totalement!
Vous pouvez faire Fichier.WriteAllText("filename.jpg", "") puis Fichier.DeleteFile("filename.jpg") avant d'enregistrer l'image bitmap. Dans mon benmark cela ne prend que .001 secondes et vous obtenez un beau "Vous n'avez pas l'autorisation d'enregistrer filename.jpg il y'
Dans mon cas, le répertoire n'existe pas.
OriginalL'auteur Savindra
Je vais ajouter cette cause de l'erreur ainsi dans l'espoir qu'il permet à certains de l'internet du futur voyageur. 🙂
GDI+ limite la hauteur maximale d'une image à 65500
De nous faire un peu de base de redimensionnement d'image, mais dans le redimensionnement nous essayons de maintenir le ratio d'aspect. Nous avons une QA gars qui est un peu trop bon à ce travail; il a décidé de tester avec un pixel de large photo qui a été de 480 pixels de haut. Lorsque l'image a été réduite pour répondre à nos dimensions, la hauteur a été nord de 68 000 pixels et notre application mobile, a explosé avec
A generic error occurred in GDI+
.Vous pouvez le vérifier vous-même avec test:
C'est dommage il n'y a pas une ambiance conviviale .net
ArgumentException
jeté dans le constructeur deBitmap
.De mes tests, 65535 est en fait la valeur max. À 65536 je commence à voir le générique de l'erreur.
Juste essayé ce nouveau: Win10 .net 4.5 et .net 4.6.1, et il a soufflé jusqu'à 65501 qui semble encore plus aléatoire. Le Code est également entachées d'erreurs de syntaxe, mettra à jour 🙂
OriginalL'auteur Fred
Cet article explique en détail ce qui se passe exactement: Les images Bitmap et les Images constructeur dépendances
En bref, pour une durée de vie d'un
Image
construit à partir d'un flux, le flux ne doit pas être détruit.Ainsi, au lieu de
essayer cette
et fermer imageStream à la forme étroite ou une page web à proximité.
using
et plus tard essayé de copier l'image dans un flux de mémoire et a reçu le dread "erreur Générique dans GDI+" message.Même cas pour moi, merci ça fonctionne maintenant!
Qui était-il !!! Je vous remercie beaucoup.
Votre lien a me donner infini redirige; celui-ci fonctionne. J'ai été d'obtenir un problème avec la sauvegarde
PixelFormat.Format32bppArgb
mais pasPixelFormat.Format1bppIndexed
. L'article que vous avez lié explique pourquoi: GDI+ peut choisir de re-décoder les données de l'image à partir de la source de flux plutôt que de tout garder en mémoire. Ma conjecture est qu'il n'a pas re-décoder 1bpp images.Même le nouveau lien se complique pas travailler plus. Une simple recherche google ne semblent pas révéler la bonne page. Mais j'ai été très heureux de trouver cette réponse! Mon travail autour de copier un nouveau bitmap échoué en raison de ce problème
OriginalL'auteur Ivan Mesic
Vous obtiendrez également de cette exception, si vous essayez d'enregistrer à un chemin d'accès non valide ou si il y a un problème d'autorisations.
Si vous n'êtes pas sûr à 100% que le chemin d'accès au fichier est disponible et que les autorisations sont correctes, puis essayer d'écrire un vers un fichier texte. Cela prend juste quelques secondes pour statuer sur ce qui allait être très simple à corriger.
Et n'oubliez pas de nettoyer votre fichier.
Oui! Le dossier que vous enregistrez doit exister. Je vais maintenant faire un chèque pour le premier, avant que j'essaie d'enregistrer une image. (Encore, l'erreur m'attrape, environ une fois par an.)
Mon Chemin a été un répertoire, au lieu d'un fichier.
OriginalL'auteur Kirk Broadhurst
Enregistrer l'image bitmap variable
Sauvé ma journée.. ne sais pas ce qui a causé le problème, mais Bitmap enregistrer fonctionne.. Système.De dessin.L'Image ne sera pas enregistrer de flux de mémoire mais Bitmap n'!!!
Attention... cela change le format de pixel 32bpp.
C'était la meilleure solution pour moi. La création de nouveaux Bitmap et de la conversion à partir d'elle.
Cela a fonctionné pour moi, merci. +1
OriginalL'auteur Amir Atashin
J'ai trouvé que si l'un des dossiers parents, où j'ai été en enregistrant le fichier avait un espace arrière puis GDI+ jeter le générique d'exception.
En d'autres termes, si j'ai essayé de sauver "C:\Documents and Settings\myusername\Local Settings\Temp\ABC DEF M1 Tendance des Valeurs de \Images\photo.png" ensuite, il a jeté le générique d'exception.
Mon nom de dossier a été généré à partir d'un nom de fichier qui est arrivé à avoir un espace de remplissage, de sorte qu'il était facile de .Trim() et passer à la suite.
OriginalL'auteur Igilima
Juste au cas où si quelqu'un est en train de faire que des trucs stupides comme je l'ai été.
1. assurez-vous que le chemin n'existe pas.
2. assurez-vous que vous disposez des autorisations d'écriture.
3. assurez-vous que votre chemin d'accès est correct, dans mon cas, j'ai été absent de nom de fichier dans la TargetPath 🙁
il devrait l'ai dit, votre chemin suce que "générique erreur s'est produite dans GDI+"
OriginalL'auteur ahsant
J'ai aussi eu cette erreur lors de l'enregistrement de fichiers Jpeg, mais seulement pour certaines images.
Mon code final:
Je n'ai pas de créer les images donc je ne peux pas dire quelle est la différence.
Je vous en serais reconnaissant si quelqu'un pouvait expliquer cela.
C'est mon SaveJpeg fonction juste pour info:
OriginalL'auteur Aximili
C'est une extension /qualification de Fred réponse qui a déclaré: "GDI limite la hauteur d'une image à 65534". Nous avons rencontré ce problème avec un de nos .NET applications, et après avoir vu le post, l'externalisation de l'équipe levé les mains en l'air et dit qu'ils ne pouvaient pas résoudre le problème sans modifications majeures.
Basé sur mes tests, il est possible de créer, de manipuler des images avec une hauteur plus grande que 65534, mais la question qui se pose lors de l'enregistrement d'un flux ou d'un fichier DANS CERTAINS FORMATS. Dans le code suivant, la t.Méthode Save() de l'appel jette notre ami le générique exception lorsque la hauteur en pixels est 65501 pour moi. Pour des raisons de curiosité, j'ai répété le test pour la largeur, et la même limite appliquée à l'économie.
La même erreur se produit également si vous écrivez à un flux de mémoire.
D'aller faire un tour, vous pouvez répéter le code ci-dessus et remplacer ImageFormat.Tiff ou ImageFormat.Bmp pour ImageFormat.Jpeg.
Cela va jusqu'à des hauteurs /largeurs de 100 000 pour moi - je n'ai pas tester les limites. Comme il arrive .Tiff est une option viable pour nous.
ÊTRE AVERTI
La mémoire TIFF flux /fichiers consomment plus de mémoire que leurs JPG homologues.
OriginalL'auteur vipes
si votre code est comme suit également cette erreur se produit
Correcte est
Cela peut être parce que nous sommes de retour de l'aide du bloc
J'ai découvert "à la dure" que si wou êtes en train d'enregistrer à nouveau cette Image à un nouveau Flux (comme HttpContext.Réponse.OutputStream par exemple), vous devez également faire d'un ruisseau.Flush(), si ce n'est l'erreur se fait de nouveau.
OriginalL'auteur dhinesh
Avait une très problème similaire et j'ai aussi essayé le clonage de l'image qui ne fonctionne pas. J'ai trouvé que la meilleure solution était de créer un nouvel objet Bitmap de l'image qui a été chargé par le flux de mémoire. De cette façon, les flux peuvent être éliminés par exemple
Espère que cette aide.
OriginalL'auteur HU.
RÉSOLU - j'ai eu exactement ce problème. Le correctif, pour moi, a été à la hausse le quota de disque pour IUSR sur le serveur IIS. Dans cet exemple, nous avons un catalogue d'applications avec des images d'objets et de ces. Le quota de téléchargement pour la "Anonyme sur le Web de l'Utilisateur" a été fixé à 100 mo, ce qui est la valeur par défaut pour ce type particulier de société d'hébergement de serveurs IIS. J'ai fait monter à 400 MO et a été en mesure de télécharger des images sans erreur.
Peut-être pas votre problème, mais si elle l'est, c'est une solution facile.
OriginalL'auteur Marco
Erreur qui se produit en raison de la Permission. assurez-vous que le dossier ont TOUS LA PERMISSION.
OriginalL'auteur vivek shaushi
Dans mon cas, le problème était dans le chemin que j'avais de l'épargne (la racine
C:\
). Changer l'D:\111\
fait l'exception en aller.OriginalL'auteur Ani
Une autre cause de cette erreur - le chemin que vous indiquez dans la méthode Save de l'occurrence de Bitmap n'existe pas ou vous n'avez pas fourni complet /chemin d'accès valide.
Juste eu cette erreur parce que j'étais de passage dans un nom de fichier et le chemin n'est pas complet!
Il arrive!
OriginalL'auteur MytyMyky
Mon tour!
Eu sur la .Enregistrer... parce que l'utilisation de() est maintenant le fichier est ouvert, donc je ne peux pas le remplacer. Peut-être que cela va aider quelqu'un dans le futur.
OriginalL'auteur Andy
Même problème que j'ai été confronté. Mais dans mon cas, j'ai essayé d'enregistrer le fichier dans le disque dur C et il n'était pas accessible. Alors j'ai essayé de sauvegarder dans le disque D qui a été entièrement accessible et j'ai réussi.
Donc d'abord vérifier vos dossiers dans lesquels vous essayez d'enregistrer. Vous devez disposer de tous (lecture et écriture), les droits de ce dossier particulier.
OriginalL'auteur Jaimin
Je remarque que votre "jpeg" est en fait:
Êtes-vous sûr que le format jpeg et pas autre chose?
Je voudrais essayer:
Ou vérifier ce que
imageToConvert.MimeType()
est effectivement de retour.Mise à JOUR
Est-il un autre d'initialisation que vous devez faire pour l'objet MemoryStream?
Oh bien j'ai toujours essayer d'éliminer l'évidence première. Je ne peux pas compter le nombre de fois où j'ai pas fait ça et c'est de revenir à la mords-moi plus tard.
OriginalL'auteur ChrisF
OriginalL'auteur Chris Halcrow
Juste de lancer une autre solution possible sur le tas, je vais citer le cas que j'ai rencontré avec ce message d'erreur. La méthode
Bitmap.Save
par cette exception lors de l'enregistrement d'une image bitmap j'avais transformé et a l'affichage. J'ai découvert qu'il ne lancerait pas l'exception, si la déclaration avait un point d'arrêt sur elle, ni ne serait-il si leBitmap.Save
, a été précédée parThread.Sleep(500)
donc je suppose qu'il y a une sorte de conflit de ressources en cours.Simplement copier l'image dans un nouvel objet Bitmap est suffisant pour empêcher cette exception d'apparaître:
OriginalL'auteur Segfault
Si vous essayez d'enregistrer une image dans un emplacement distant veillez à ajouter le
NETWORK_SERVICE
compte d'utilisateur dans les paramètres de sécurité, et donnent à l'utilisateur de lire et d'écrire des autorisations. Sinon, il ne va pas au travail.OriginalL'auteur JAH
OriginalL'auteur jeka
J'ai aussi ce message d'erreur parce que je suis en train d'enregistrer des images avec le même nom de précédentes images enregistrées.
Assurez-vous que vous n'enregistrez pas les images avec des doublons de nom.
Utiliser pour thar par exemple un "Random" de la fonction (Comment est-ce que C#'s générateur de nombre aléatoire de travail?)
ou, par exemple, générer un Guid (http://betterexplained.com/articles/the-quick-guide-to-guids/)
OriginalL'auteur Bruno Ferreira
nous avons eu le même problème sur la génération d'un PDF sur le serveur de production.
Recyclage de l'application de la piscine résoudre le problème.
Espère que cela aidera quelqu'un.
OriginalL'auteur tech-gayan
Pour moi, j'ai été en utilisant le
Image.Save(Stream, ImageCodecInfo, EncoderParameters)
et apparemment, cela a été l'origine de la tristement célèbreA generic error occurred in GDI+
erreur.J'ai essayé d'utiliser
EncoderParameter
pour enregistrer les fichiers jpeg en qualité de 100%. Ce qui fonctionnait parfaitement sur ma machine" (doh!) et non pas sur la production.Lorsque j'ai utilisé la
Image.Save(Stream, ImageFormat)
au lieu de cela, l'erreur a disparu! Donc, comme un idiot, j'ai continué à utiliser ce dernier, bien qu'il permet de gagner en qualité par défaut ce qui je suppose n'est que de 50%.Espère que cette info vous aide à quelqu'un.
OriginalL'auteur Ε Г И І И О
J'ai rencontré le problème aussi. Le problème était dû au chargement de flux en cours de cession. Mais je n'ai pas la jeter, il était à l'intérieur .Net framework. Tout ce que j'avais à faire était de les utiliser:
au lieu de
image_instance est de type System.De Windows.Les formulaires.PictureBox!
PictureBox Load() dispose, le flux de laquelle l'image a été chargé, et je ne le savais pas.
OriginalL'auteur Klaus
Basé sur la réponse de @savindra , si vous RHM sur votre application et tentez de l'exécuter comme un administrateur alors il devrait résoudre votre problème.
Mine qui semblait être un problème de permission.
OriginalL'auteur AltF4_