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.
- Cloner l'image et travailler dessus.
- Récupérer l'encodeur pour ce MIME en le passant avec le paramètre de qualité jpeg.
Réponses:
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.
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
la source
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.
la source
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:
C'est dommage qu'il n'y ait pas de .net amical
ArgumentException
jeté dans le constructeur deBitmap
.la source
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
Image
construit à partir d'un ruisseau , le ruisseau ne doit pas être détruit.Donc, au lieu de
essaye ça
et fermez imageStream à la fermeture du formulaire ou à la fermeture de la page Web.
la source
using
ensuite essayé de copier l'image dans un flux mémoire et j'ai reçu le redoutable message "Erreur générique dans GDI +".PixelFormat.Format32bppArgb
mais pasPixelFormat.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.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.
Et n'oubliez pas de nettoyer votre fichier.
la source
Enregistrer l'image dans une variable bitmap
la source
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 +"
la source
J'ai également eu cette erreur lors de l'enregistrement des fichiers JPEG, mais uniquement pour certaines images.
Mon code final:
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:
la source
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.
la source
si votre code est le suivant, cette erreur se produit également
La bonne est
Cela peut être dû au fait que nous revenons du bloc using
la source
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.
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.
la source
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
J'espère que cela t'aides.
la source
Une erreur s'est produite en raison d'une autorisation. assurez-vous que le dossier a TOUTE LA PERMISSION.
la source
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.
la source
Dans mon cas, le problème était dans le chemin que je sauvegardais (la racine
C:\
). Le changer pourD:\111\
faire disparaître l'exception.la source
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!
la source
Mon tour!
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.
la source
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.
la source
Je remarque que votre cas "jpeg" est en fait:
Êtes-vous sûr que le format est jpeg et pas autre chose?
J'essaierais:
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?
la source
la source
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.Save
lè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 siBitmap.Save
c'é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:
la source
Nous avons rencontré un problème similaire lors de la génération d'une
PDF
image 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.
la source
Si vous essayez d'enregistrer une image dans un emplacement distant, assurez-vous d'ajouter le
NETWORK_SERVICE
compte 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.la source
la source
J'obtiens également cette erreur car j'essaie d'enregistrer des images avec le même nom que les images enregistrées précédentes.
Assurez-vous de ne pas enregistrer les images avec un nom en double.
Utilisez pour thar par exemple une fonction 'Random' ( Comment fonctionne le générateur de nombres aléatoires de C #? ) Ou par exemple générez un Guid ( http://betterexplained.com/articles/the-quick-guide-to-guids/ )
la source
Simple, créer une nouvelle instance de Bitmap résout le problème.
la source
Pour moi, j'utilisais le
Image.Save(Stream, ImageCodecInfo, EncoderParameters)
et apparemment, cela causait la tristement célèbreA generic error occurred in GDI+
erreur.J'essayais d'utiliser
EncoderParameter
pour 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
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:
au lieu de
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.
la source
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.
la source
Les problèmes possibles qui provoquent une telle erreur sont:
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!
la source