Entwickler-Ecke

Multimedia / Grafik - Paletten konvertieren


xToast - Do 07.04.11 18:03
Titel: Paletten konvertieren
So, ich arbeite gerade an einem Tool zum konvertieren von Farbpaletten, ich erläutere das ganze mal kurz.
1.) Man Lädt zwei Bilder, jeweils in eine eigene Picturebox.
2.) Anschließen wird auf jedem dieser Bilder die Palette gezogen (jedes Pixel durchlaufen, falls Farbe nicht vorhanden -> speichern)
3.) Beide entstandenen Paletten werden in zwei weiere Picturboxen gezeichnet. (Zuerst mit Graphics, anschließend in Image umgewandelt)
4.) Wenn man auf einen Button klickt, soll die Palettedes ersten Bildes in die des zweiten Bildes umgewandelt werden.

So, mein Problem:
Wie setzte ich Punkt 4 um, wenn:
1.) beide Paletten gliech viele Farben haben oder
2.) jede Palette eine unterschiedliche Anzahl an Farben hat (z.b: 10 und 20)?

Folgendes habe ich bereits versucht:

C#-Quelltext
1:
2:
3:
//pbImage = PictureBox des ersten Bildes
//pbPalette2 = PictureBox der zweiten Palette
pbImage.Image.Palette = pbPalette2.Image.Palette;

Das ganze führt zu einer ArgumentException, auch wenn beide Bilder gleich viele Farben haben.
Beide PixtureBoxen haben Image != null.

Vielen Dank schonmal :D


Th69 - Do 07.04.11 19:50

Hallo,

bei einem Image kann man die Anzahl der Paletteneinträge nicht ändern, daher gibt es auch für ColorPalette keinen öffentlichen Konstruktor.
Man kann aber die Einträge selbst der bestehenden Palette ändern, d.h.

C#-Quelltext
1:
2:
for(int i=0; i<image.Palette.Entries.Length; i++)
   image.Palette.Entries[i] = Color.FromArgb(a, r, g, b); // bzw. = image2.Palette.Entries[i]

Bei gleicher Anzahl also einfach die Einträge der Reihe nach kopieren.

Bei unterschiedlicher Palettengröße mußt du wohl ein neues Bitmap erstellen und dann als PixelFormat eines der 'Indexed'-Formate angeben (z.B. Format8bppIndexed). Und anschließend dann die Einträge wie oben kopieren.


xToast - Fr 08.04.11 16:19

Ich verstehe aber nicht, warum bei mir die Entries von Palette immer eine Lenght von 0 haben, egal wie viele Farben vorhanden sind, und obwohl ich mit

C#-Quelltext
1:
2:
3:
Bitmap b = new Bitmap(width, height);
//Befüllen
pbPalette.Image = b; //(Image)b auch schon versucht

ein mehrfarbiges Bild zuweise.


Th69 - Fr 08.04.11 16:28

Hallo xToast,

wie schon geschrieben, haben nur indizierte Bilder (Indexed) überhaupt eine Palette, alle anderen Formate (z.B. Format24bppRgb) speichern direkt die Farben je Pixel.

Probiere also mal:

C#-Quelltext
1:
Bitmap b = new Bitmap(width, height, PixelFormat.Format4bppIndexed);                    

Die Palette müßte nun 16 Farben enthalten.


xToast - Fr 08.04.11 16:39

Ahh, danke, wobei jetzt das Problem auf kommt, wie ich von Format32bppARGB zu einem Indexed konvertieren kann, Graphics.FromImage funktioniert nämlich nicht mit Indexed-Farben.
Aber gibt es nicht eine möglichkeit, von mir aus Pixel-Per-Pixel, ohne die Palette auf 256 Farben zu begrenzen?