Nichts wird Ihnen mit GDI helfen. Es scheint, indexierte Bilder sind zu rückständig eine Technologie für Microsoft zu kümmern. Sie können nur indizierte Bilddateien lesen und schreiben.
Es gibt in der Regel zwei Schritt, wenn die Quantisierung Farben in einem Bild:
1) Finden Sie die besten Palette für das Bild (Farbquantisierung)
2) Ordnen Sie die Quelle solors auf die gefundene Palette (Color Mapping)
Von dem, was ich verstehe, haben Sie bereits die Palette in der Datenbank, dh der schwierigste Teil wurde für Sie erledigt. Alles, was Sie tun müssen, ist, die 24-Bit-Farben den bereitgestellten Palettenfarben zuzuordnen. Wenn Sie nicht über die Startpalette verfügen, müssen Sie sie mit einem Quantisierungsalgorithmus berechnen: Am bekanntesten sind Octrees oder Median Cut. Median Cut liefert bessere Ergebnisse, ist jedoch langsamer und schwieriger zu implementieren und fein abzustimmen.
Um die Farben zuzuordnen, ist der einfachste Algorithmus in Ihrem Fall, den Abstand von Ihrer Quellfarbe zu allen Palettenfarben zu berechnen und den nächsten auszuwählen.
float ColorDistanceSquared(Color c1, Color c2)
{
float deltaR = c2.R - c1.R;
float deltaG = c2.G - c1.G;
float deltaB = c2.B - c1.B;
return deltaR*deltaR + deltaG*deltaG + deltaB*deltaB;
}
Sie können ponderate auch die Kanäle, so dass blaue weniger Gewicht hat, gehen Sie nicht zu über Bord mit ihm, sonst wird es schrecklich Ergebnisse geben, speziell 30/59/11 wird nicht funktionieren:
float ColorDistanceSquared(Color c1, Color c2)
{
float deltaR = (c2.R - c1.R) * 3;
float deltaG = (c2.G - c1.G) * 3;
float deltaB = (c2.B - c1.B) * 2;
return deltaR*deltaR + deltaG*deltaG + deltaB*deltaB;
}
Nennen Sie dieses Ding für alle Quell- und Palettenfarben und finden Sie die Min. Wenn Sie Ihre Ergebnisse auf einer Karte zwischenspeichern, wird das sehr schnell gehen.
Außerdem passt die Quellfarbe selten zu einer Palettenfarbe, die nicht zu Streifenbildung und Unebenheiten sowie zum Verlust von Details in Ihrem Bild führt. Um dies zu vermeiden, können Sie Dithering verwenden. Der einfachste Algorithmus, der die besten Ergebnisse liefert, ist das Error Diffusion Dithering.
Sobald Sie Ihre Farben zugeordnet haben, müssen Sie ein Bitmap manuell sperren und die Indizes darin schreiben, da .Net Ihnen nicht erlaubt, auf ein indiziertes Bild zu schreiben.
+1, nette Frage! –