Alternatives au Système.Dessin pour une utilisation avec ASP.NET?
Après plusieurs jours de traque bizarre GDI+ erreurs, je suis tombé sur ce petit bijou sur MSDN:
Classes à l'intérieur du Système.Le dessin de l'espace de noms ne sont pas pris en charge pour une utilisation à l'intérieur d'un Windows ou d'ASP.NET service. Essayez d'utiliser ces classes à partir de l'intérieur de l'un de ces types d'application peuvent produire des problèmes inattendus, comme une diminution des services de la performance et de l'exécution des exceptions.
Je ne sais pas si "ASP.NET de service" signifie "application web" dans ce contexte, mais "une diminution des services de la performance" semble couvrir l'assortiment aléatoire de "générique erreur s'est produite dans GDI+" et "Out of memory" les erreurs que mon application est en train de jeter intermittente, non reproductible des erreurs de lecture et d'écriture des images JPEG dans de nombreux cas ont été effectivement créés par le Système.De dessin.L'imagerie en premier lieu.
Si - si GDI+ ne peut pas lire et écrire des fichiers JPEG de manière fiable dans une application Web, que dois-je utiliser à la place?
Je veux que les utilisateurs soient en mesure de télécharger des images (JPEG besoin, d'autres formats utiles), rééchantillonner de manière fiable, et l'affichage de messages d'erreur utiles si quelque chose va mal. Des idées? Sont le Système.Les médias espaces de noms à partir de WPF utile d'envisager?
EDIT: Ouais, je sais GDI+ travaille "la plupart du temps". Ce n'est pas assez bon, parce que quand il échoue, il le fait d'une manière qui est impossible à isoler ou à récupérer de douceur. Je ne suis pas intéressé par les exemples de GDI+ code qui fonctionne pour vous: je suis à la recherche d' autres bibliothèques à utiliser pour le traitement de l'image.
- J'ai un de ces moments que GDI+ échoue toujours, peu importe cependant de nombreux essayez de captures/de l'usage je l'ai mis. Voir stackoverflow.com/questions/3125242/...
- Avez-vous un lien mis à jour ou était-ce un non-problème et la question a été supprimé?
- je ne sais pas pourquoi le lien a été modéré. je n'ai toujours pas trouvé de solution pour mon non de la police système GDI+ échouer. C'est même sur .net 4. J'ai renoncé et a commencé à utiliser le système de polices
- Merci pour le soutien de devis et de lien. Ils ont également "Pour une prise en charge alternative, voir Windows Composants d'Imagerie." msdn.microsoft.com/library/windows/desktop/...
- Il y a aussi SkiaSharp.
Vous devez vous connecter pour publier un commentaire.
Il y a un super post de blog, y compris le code C# sur l'utilisation de l' ImageMagick bibliothèque graphique grâce à l'Interopérabilité de plus en TopTen Logiciel De Blog. Ce post traite spécifiquement de l'exécution de ASP.net sur linux sous mono; toutefois, le code C# doit être parfaitement copier-coller-mesure, la seule chose que vous aurez besoin de changement est l'Interopérabilité des attributs si vous êtes sous windows référencement d'une fenêtre binaire (DLL).
Il y a aussi un ImageMagick .Net projet de développement sur codeplex qui enveloppe tout pour vous. Mais ce n'est pas le développement actif depuis 2009, de sorte qu'il peut être à la traîne de l'actuelle version de bibliothèque ImageMagick. Pour un petit trivial de redimensionnement de la routine, je serais probablement s'en tenir à l'interopérabilité. Vous avez juste besoin de regarder votre mise en œuvre avec soin pour votre propre fuite de mémoire ou inédits de ressources (la bibliothèque elle-même est bien testée et approuvée par la communauté).
La bibliothèque est libre et open source. La licence Apache 2 semble être compatible avec à la fois personnelle et à des fins commerciales. Voir ImageMagick Page Licence.
La bibliothèque est totalement de la croix-plate-forme et met en œuvre de nombreux et puissants de l'image de la manipulation et de la transformation des routines qui ne sont pas trouvés dans GDI+ (ou pas mis en œuvre sous mono) et a une bonne réputation comme une alternative pour ASP.net traitement de l'image.
Mise à jour: Ressemble à une version mise à jour d'une .NET wrapper ici: http://magick.codeplex.com/
Oui, utiliser WPF
System.Windows.Media
classes. Étant entièrement gérée ils ne subissent pas les mêmes problèmes que le GDI choses.Voici un extrait de quelques MVC code que j'ai utiliser pour le rendu des dégradés, pour vous donner une idée de la façon d'obtenir à partir d'une WPF
Visual
à un PNG:Vous pouvez trouver un très bon article à partir d'un Employé de Microsoft ici: Le redimensionnement d'images à partir du serveur à l'aide de WPF/WIC au lieu de GDI+ qui propose d'utiliser WPF au lieu de GDI+. C'est plus sur thumbnailing mais c'est globalement les mêmes questions.
De toute façon, à la fin, il déclare ceci:
Donc WPF est également pas pris en charge dans les applications web, et est toujours, je crois :-S
ImageSharp
ImageSharp est un open-source multi-plateforme 2D graphiques de la bibliothèque. Il est écrit en C# sur le dessus de la nouvelle .NET Standard, avec aucune dépendance sur n'importe quel OS API spécifique.
Il est actuellement encore en pre-release sur MyGet (vous devrez ajouter le paquet source dans le VS options ou un NuGet.fichier de config), mais nous sommes déjà en l'utilisant avec des résultats très positifs.
La plupart des questions que j'ai lu sur se rapportent à des ressources qui ne sont pas éliminés correctement.
J'ai utilisé des variantes de ce code, encore et encore, sans aucun problème à partir d'applications web:
Vous pouvez avoir un coup d'oeil à http://gd-sharp.sourceforge.net/ qui est un wrapper pour la bibliothèque GD. Je n'ai pas testé mais il semble prometteur.
J'ai eu un bon comportement de la bibliothèque Cairo (http://www.cairographics.org) dans un ASP.Net le serveur web de l'environnement. J'ai effectivement déplacé au caire à partir de WPF en raison de WPF mauvaise utilisation de la mémoire de modèle pour le web basé sur des trucs.
WPF fait tend à fonctionner à votre processus de travail de mémoire. Aucun des objets WPF mettre en œuvre
IDisposable
, et beaucoup d'entre eux de référence de mémoire non managée c'est seulement libéré par l'intermédiaire d'un outil de finalisation. La forte utilisation de WPF (surtout si votre serveur est significativement CPU-imposables) finira par vous exécutez hors de la mémoire parce que votre outil de finalisation de la file d'attente devient saturé. Quand j'étais profilage de mon application, par exemple, la file d'attente de finalisation avait plus de 50 000 objets, beaucoup d'entre eux possèdent des références à une mémoire non managée. Le caire a été beaucoup mieux pour moi, et son utilisation de la mémoire de modèle a été beaucoup plus prévisible que WPF.Si vous êtes intéressés par l'utilisation du caire, de saisir les libs de GTK+'s site web. Ils ont un x86 ainsi que d'un x64 ensemble de binaires.
Le seul inconvénient est que le caire ne peut pas lire/écrire JPG natif; cependant, vous pouvez facilement adapter WPF trucs pour la lecture/écriture de JPG et de faire le rééchantillonnage/mise à l'échelle/dessin/que ce soit d'autre à l'aide du Caire.