C #: recherche d'algorithme / bibliothèque de compression PNG
J'ai besoin de compresser ou, au moins, baisse de la qualité de certaines images png que les utilisateurs sont en téléchargement sur mon site. J'ai déjà redimensionnées, mais qui ne fait pas beaucoup pour la taille de l'image.
La recherche d'un png/compression d'image ou de perte de qualité de l'algorithme ou de la bibliothèque .net 4.0 ou moins.
C'est de cette façon que j'ai actuellement enregistrer/convertir mes images:
Image mainImg = ImageHelper.ResizeImage(bmp, 600, 500, false);
mainImg.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);
source d'informationauteur Shawn Mclean | 2010-12-11
Vous devez vous connecter pour publier un commentaire.
Malheureusement, .NET (et GDI+, qui la .NET bibliothèques graphiques sont construits sur) ne prend pas en charge les paramètres d'encodage pour PNG. En fait, si vous appelez GetEncoderParameterList sur votre image avec les PNG codeur Clsid, vous obtiendrez un "Non implémenté" l'exception".
Encore plus malheureux, c'est que les deux ImageFormat et ImageCodecInfo sont scellés classes et vous ne pouvez pas ajouter de nouveaux codecs pour quoi .NET peut accéder en mode natif. Microsoft a laissé tomber la boule sur celui-ci.
Ce qui signifie que vos solutions de rechange sont, dans l'ordre décroissant de masochisme:
1) mettre en Œuvre une fonction de sauvegarde sur votre propre dans .NET qui met en œuvre la RFC 2083,
2) mettre en Œuvre une fonction de sauvegarde basée sur le portage de libpng .NET,
3) Appeler le code non managé qui a été construit à partir de libpng directement
libpng a beaucoup de documentation et de est gratuit, à la fois dans la disponibilité et la licence de la permissivité.
PNG est généralement un lossless schéma de compression, ce qui signifie que la qualité de l'image n'est jamais réduite à moins de réduire le nombre de pixels (taille) ou la profondeur de couleur. Il existe trois façons de réduire la taille de fichier des images PNG:
Qu'il semble .NET n'est pas un moyen intégré pour modifier la précompression des filtres ou des paramètres de compresseur de Png, de sorte que vous aurez à utiliser une bibliothèque externe. OptiPNG ou à l'un des d'autres PNG outils d'optimisation ne sont pas indigènes .NET bibliothèques, de sorte que vous aurez à traiter avec P/Invoquant les bibliothèques ou de l'exécution d'un processus distinct de.. traitement de chaque image. Cependant, vous êtes souvent à la recherche d'une économie d'environ 5% ou moins (bien que j'ai vu jusqu'à 40%), puisque c'est finalement une lossless processus.
Je le recommande à l'encontre de la réduction de la profondeur de couleur dans le système automatisé de scénario que vous décrivez, car les résultats peuvent vraiment terrible (pensez dégradée GIFs de vieux). (Cependant, Si vous êtes manuel d'optimisation, regardez La Quantification De La Couleur sur Windows et ImageAlpha sur Mac.)
De façon réaliste, la meilleure façon, vous pouvez réduire la taille du fichier au détriment de la qualité est de les convertir en JPEG, ce qui ne nécessite pas de dépendances externes, et est conçu pour être un algorithme de compression avec perte:
Malheureusement, .Net processeur d'image png pour ne pas faire n'importe optimisation heuristiques sur la sortie. Votre meilleur pari est d'avoir un optipng/pngcrush binaires disponibles sur le serveur, de rendre le redimensionnement de la sortie vers un fichier temporaire, puis utilisez pngcrush sur elle par l'intermédiaire d'un Système.Diagnostics.Processus.
Pour la plupart, si la prise en charge sont les photos et le format d'origine est JPEG, alors vous serez mieux servi en utilisant JPEG de sortie.