//Cet article a été traduit par www.blue1000.com , l'adresse originale est http://codebetter.com/blogs/brendan.tompkins/archive/2004/01/26/6103.aspx
//Respectez les fruits du travail des autres, veuillez indiquer la source lors de la réimpression.
GDI+ est souvent utilisé lors de l'écriture de programmes. Il peut enregistrer une image sombre de 32 bpp sous forme de fichier GIF, et le processus est relativement simple. Et avant d'enregistrer cette image gif à l'aide de la méthode CreateThumnailImage, vous pouvez également ajuster sa taille.
Codes couramment utilisés :
Le code ci-dessus peut terminer le dessin et l'enregistrement des fichiers gif, mais vous rencontrerez bientôt un problème : la vignette générée. la qualité de l'image du fichier .gif est bien inférieure à nos attentes.
Image d'effet:
L'image granuleuse de mauvaise qualité présentée ci-dessus nécessite également un traitement de « quantification des couleurs » (palettisation). Cela se produit parce que GDI+ utilise 256 couleurs par défaut, sans tenir compte de la couleur réelle de l'image elle-même.
Après cela, nous avons essayé de créer notre propre "palette", mais les résultats étaient encore pires :). Un bon algorithme de « quantification des couleurs » devrait envisager de remplir l'espace entre deux particules de pixels avec une couleur de transition similaire à la couleur des deux pixels, offrant ainsi un espace colorimétrique plus visible.
Il s'agit de l'algorithme "Octree". L'algorithme « Octree » nous permet de brancher notre propre algorithme pour quantifier nos images.
Voici deux articles de Microsoft qui peuvent nous être utiles : KB 319061 et Optimisation de la quantification des couleurs pour les images ASP.NET (par Morgan Skinner, Microsoft). Morgan Skinner fournit un bon code d'algorithme "Octree", que vous pouvez télécharger pour référence.
Utiliser OctreeQuantizer est simple :
System.Drawing.Bitmap b = new System.Drawing.Bitmap("c:\original_image.gif");
System.Drawing.Image thmbnail = b.GetThumbnailImage(100,75,null,new IntPtr());
quantificateur OctreeQuantizer = nouveau OctreeQuantizer (255, 8) ;
en utilisant (Bitmap quantifié = quantizer.Quantize (thmbnail))
{
quantized.Save("c:\thumnail.gif", System.Drawing.Imaging.ImageFormat.Gif);
}
OctreeQuantizer grayquantizer = nouveau GrayscaleQuantizer ( );
en utilisant ( Bitmap quantifié = grayquantizer.Quantize (thmbnail))
{
quantized.Save("c:\thumnail.gif", System.Drawing.Imaging.ImageFormat.Gif);
}
L'image de l'effet est la suivante (est-ce beaucoup plus beau ?) :