ventajas vectorial usos que mapa imagen formatos formato entre diferencia desventajas corel colores caracteristicas c# image image-processing bitmap palette

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:

  1. Asigne un nuevo alias a bmp.Palette asignándolo a una variable,
  2. Modifíquelo por un nuevo alias (esto evita la recarga),
  3. Y bmp.Palette a la bmp.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