Ich brauche für ein kleines anderes Projekt (dazu in einem späteren Post mehr) eine Palette von allen Farben, die in einer Sammlung von Bildern vorkommen. Hier kann mal wieder das Schweizertaschenmesser der Bildverarbeitung glänzen: Imagemagick. Um eine Farbpalette aus einem Bild herauszukriegen, kann man folgenden Befehl ausführen:
magick bild.png -unique-colors palette.png
Das erstellt ein Bild mit einer Höhe von einem Pixel und so breit, wie die Anzahl der Farben ist. Jedes Pixel hat ein der Farben, die in dem Ursprungsbild vorkamen, alle Farben tauchen in dem Ausgabebild auf.
Man kann sich die Farben auch in einer Textdatei ausgeben lassen
magick all.png -unique-colors txt:palette.txt
Der halbe Weg ist also geschafft. Ich will aber nicht die Palette eines Bildes, sondern die Palette mehrerer Bilder zusammen. Wenn ich mehrere Eingabedateien angebe, erstellt mir Imagemagick hier aber einfach eine Palette pro Datei. Das reicht also nicht. Ich habe ein bisschen herumgesucht, und bin nur auf einen Workaround gekommen: Ich füge erst alle Bilder zu einer Bilddatei zusammen und nehme dann die Palette dieses Gesamtbildes. Das Zusammenfügen kann man z.B. so machen:
convert -append img/* all.png
Wobei in diesem Fall die Eingabedateien unter img liegen und all.png die Ausgabedatei ist. Eine wichtige Einschränkung: Wenn die Eingabebilder nicht alle gleich groß sind, wird es weiße Flächen in all.png geben. Das heißt, es wird eventuell weiß zur Palette hinzugefügt, obwohl das falsch wäre. In meinem Fall war aber weiß ohnehin Teil der Palette. Ansonsten kann man Imagemagick sicher auch irgendwie dazu bringen, den Hintergrund anders zu färben.
Damit jedenfalls habe ich meine Palette:
![]()
Oh, warte, das kann man kaum sehen. Also hier eine vergrößerte Variante:
![]()
Und hier die Textausgabe:
# ImageMagick pixel enumeration: 16,1,0,255,srgb
0,0: (0,0,0) #000000 black
1,0: (128,0,0) #800000 maroon
2,0: (255,0,0) #FF0000 red
3,0: (0,128,0) #008000 green
4,0: (0,255,0) #00FF00 lime
5,0: (128,128,0) #808000 olive
6,0: (255,255,0) #FFFF00 yellow
7,0: (0,0,128) #000080 navy
8,0: (0,0,255) #0000FF blue
9,0: (128,0,128) #800080 purple
10,0: (255,0,255) #FF00FF magenta
11,0: (0,128,128) #008080 teal
12,0: (0,255,255) #00FFFF cyan
13,0: (128,128,128) #808080 fractal
14,0: (192,192,192) #C0C0C0 silver
15,0: (255,255,255) #FFFFFF white