Autor Beitrag
xToast
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Do 07.04.11 18:03 
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
Bitmap b = new Bitmap(width, height, PixelFormat.Format4bppIndexed);					

Die Palette müßte nun 16 Farben enthalten.
xToast Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: 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?