Nada lo ayudará con GDI. Parece que las imágenes indexadas son una tecnología demasiado atrasada para que Microsoft se preocupe. Todo lo que puede hacer es leer y escribir archivos de imágenes indexadas.
por lo general hay dos pasos cuando los colores de cuantificación en una imagen:
1) Encontrar la mejor gama de colores para la imagen (color de cuantificación)
2) en el mapa los solors de origen a la paleta encontrado (Asignación de color)
Por lo que entiendo, ya tiene la paleta en la base de datos, eso significa que la parte más difícil se ha hecho por usted. Todo lo que necesita hacer es asignar los colores de 24 bits a los colores de paleta proporcionados. Si no tiene la paleta inicial, tendrá que calcularla usted mismo usando un algoritmo de cuantificación: los octrees o Median Cut son los más conocidos. Median Cut da mejores resultados pero es más lento y más difícil de implementar y afinar.
Para asignar los colores, el algoritmo más simple en su caso es calcular la distancia desde el color de origen a todos los colores de la paleta y elegir el más cercano.
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;
}
También puede ponderar los canales de modo que el azul tiene menos peso, no ir demasiado al agua con él, de lo que dará resultados horribles, específicamente 30/59/11 no funcionará en absoluto:
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;
}
Llama esa cosa para todos los colores de fuente y paleta y busca el valor Mín. Si almacena en caché los resultados a medida que avanza en un mapa, esto será muy rápido.
Además, el color de la fuente rara vez se ajustará a un color de paleta suficiente para no crear bandas y áreas planas y la pérdida de detalles en su imagen. Para evitar eso, puedes usar el dithering. El algoritmo más simple y el que ofrece los mejores resultados es el Difuminado de difusión de errores.
Una vez que haya mapeado sus colores, tendrá que bloquear manualmente un mapa de bits y escribir los índices allí, ya que .Net no le permitirá escribir en una imagen indexada.
+1, buena pregunta! –