c# - vectorial - mapa de bits ventajas y desventajas
No se puede establecer la paleta en mapa de bits (2)
He estado escribiendo un decodificador PCX y, hasta ahora, la imagen PCX en sí misma funciona bien, pero no puedo averiguar cómo configurar la paleta de un mapa de bits.
He creado un mapa de bits así:
Bitmap bmp = new Bitmap(width,
height,
stride2,
System.Drawing.Imaging.PixelFormat.Format8bppIndexed,
pixels);
Pero parece que no puedo configurar la paleta con el siguiente método:
for (int i = 0; i < 256; i += 3)
{
Color b = new Color();
b = Color.FromArgb(palette[i], palette[i + 1], palette[i + 2]);
bmp.Palette.Entries.SetValue(b, i);
}
En este ejemplo, he leído cada byte en la paleta del archivo pcx y los he almacenado en la paleta []. a partir de ahí, he usado esto para establecer las entradas en la paleta del mapa de bits. ¿Cómo configuro los colores?
De acuerdo con Microsoft Reference Source , la propiedad de Palette
de la clase de Image
en .net, utiliza internamente las API planas de GDI + para manejar paletas. GdipGetImagePalette
utilizado para inicializar el objeto ColorPalette
en el método get
y GdipSetImagePalette
utilizado para escribir los datos del objeto ColorPalette
nuevamente en el dispositivo es el método set
.
Cada vez en su bucle for
la línea bmp.Palette.Entries.SetValue(b, i);
obliga a la Imagen a llamar a GdipGetImagePalette
y los datos de bmp.Palette
reinicializan y, por lo tanto, se puede ver que no se han realizado bmp.Palette
en bmp.Palette
después del bucle.
Para resolver este problema debes hacer lo siguiente:
- Asigne un nuevo alias a
bmp.Palette
asignándolo a una variable, - Modifíquelo por un nuevo alias (esto evita la recarga),
- Y
bmp.Palette
a labmp.Palette
.
Código:
var newAliasForPalette = bmp.Palette; // Palette loaded from graphic device
for (int i = 0; i < 256; i++)
{
newAliasForPalette.Entries[i] = myColor[i];
}
bmp.Palette = newAliasForPalette; // Palette data wrote back to the graphic device
En mi opinión, el reemplazo de la definición de Palette
como propiedad por los GetPalette()
y SetPalette()
de Microsoft, será de gran ayuda para evitar confusiones.
Esto me tenía confundido también. Parece bitmap.Palette devuelve un clon de la paleta de bitmap. Una vez que haya modificado su copia, debe restablecer la paleta del mapa de bits usando bitmap.Palette = palette
, por ejemplo
ColorPalette palette = bitmap.Palette;
Color entries = palette.Entries;
....
entries[i] = new Color(...);
....
bitmap.Palette = palette; // The crucial statement
Consulte http://www.charlespetzold.com/pwcs/PaletteChange.html