//Dieser Artikel wurde von www.blue1000.com übersetzt, die Originaladresse lautet http://codebetter.com/blogs/brendan.tompkins/archive/2004/01/26/6103.aspx
// Respektieren Sie die Früchte der Arbeit anderer. Bitte geben Sie beim Nachdruck die Quelle an.
GDI+ wird häufig beim Schreiben von Programmen verwendet. Es kann ein dunkles 32-bpp-Bild als GIF-Datei speichern, und der Vorgang ist relativ einfach. Und bevor Sie dieses GIF-Bild mit der Methode CreateThumnailImage speichern, können Sie auch seine Größe anpassen.
Häufig verwendete Codes:
Der obige Code kann das Zeichnen und Speichern von GIF-Dateien abschließen, aber Sie werden bald auf ein Problem stoßen: das generierte Miniaturbild Die Bildqualität der GIF-Datei liegt weit unter unseren Erwartungen.
Effektbild:
Das oben gezeigte, körnige Bild mit geringer Qualität erfordert auch eine „Farbquantisierung“-Verarbeitung (Palettierung). Dies liegt daran, dass GDI+ standardmäßig 256 Farben verwendet, ohne die tatsächliche Farbe des Bildes selbst zu berücksichtigen.
Danach haben wir versucht, unsere eigene „Palette“ zu erstellen, aber die Ergebnisse waren noch schlechter :). Ein guter „Farbquantisierungs“-Algorithmus sollte in Betracht ziehen, den Raum zwischen zwei Pixelpartikeln mit einer Übergangsfarbe zu füllen, die der Farbe der beiden Pixel ähnelt und so einen sichtbareren Farbraum bietet.
Dies ist der „Octree“-Algorithmus. Der „Octree“-Algorithmus ermöglicht es uns, unseren eigenen Algorithmus zur Quantisierung unserer Bilder einzubinden.
Hier sind zwei Artikel von Microsoft, die für uns hilfreich sein könnten: KB 319061 und Optimizing Color Quantization for ASP.NET Images (von Morgan Skinner, Microsoft). Morgan Skinner stellt einen guten „Octree“-Algorithmuscode zur Verfügung, den Sie als Referenz herunterladen können.
Die Verwendung von OctreeQuantizer ist einfach:
System.Drawing.Bitmap b = new System.Drawing.Bitmap(“c:\original_image.gif“);
System.Drawing.Image thmbnail = b.GetThumbnailImage(100,75,null,new IntPtr());
OctreeQuantizer quantizer = new OctreeQuantizer(255, 8);
using (Bitmap quantized = quantizer.Quantize (thmbnail) )
{
quantized.Save(“c:\thumnail.gif“, System.Drawing.Imaging.ImageFormat.Gif);
}
OctreeQuantizer greyquantizer = new GrayscaleQuantizer ();
using (Bitmap quantized = greyquantizer.Quantize (thmbnail))
{
quantized.Save(“c:\thumnail.gif“, System.Drawing.Imaging.ImageFormat.Gif);
}
Das Effektbild sieht wie folgt aus (ist es viel schöner?):