Skript fuer Gimp gpl-Datei nach Bitmap

0 views
Skip to first unread message

Patrick Rudin

unread,
Jul 30, 2021, 9:30:05 AMJul 30
to
Eher eine Skriptfrage als eine Gimpfrage, daher frage ich mal hier.

Konkrete benutze ich das Programm Gpick, um passende Farbschemen
auszusuchen und zusammenzustellen. Die lassen sich dann als gpl-Datei
speichern, das ist das Gimp-Format, ein reines Textfile mit den
ausgesuchten Farbwerten. Diese Datei sieht dann beispielsweise so aus:

GIMP Palette
Name: gruen.gpl
Columns: 1
#
99 157 65 Asparagus
101 91 81 Charcoal grey
219 194 167 Mushroom
137 184 108 Dull green

Nun möchte ich daraus ohne händische Arbeit direkt eine bitmap erstellen
lassen von ungefähr dieser Grösse:

https://lospec.com/palette-list/unearthly-32x.png

Von der Anordnung her allerdings gerne quadratisch, überzählige Felder
halt einfach mit schwarz aufgefüllt.

Vermutlich müsste man sowas mit Imagemagick irgendwie hinkriegen?


Grüsse

Patrick

Manuel Reimer

unread,
Jul 31, 2021, 5:48:41 AMJul 31
to
On 30.07.21 15:30, Patrick Rudin wrote:
> Nun möchte ich daraus ohne händische Arbeit direkt eine bitmap erstellen
> lassen von ungefähr dieser Grösse:
>
> https://lospec.com/palette-list/unearthly-32x.png
>
> Von der Anordnung her allerdings gerne quadratisch, überzählige Felder
> halt einfach mit schwarz aufgefüllt.
>
> Vermutlich müsste man sowas mit Imagemagick irgendwie hinkriegen?

Auf jeden Fall geht sowas mit Python und der "PIL" (Pillow) Library.

Allerdings nicht mal eben in 10 Minuten und ich habe selber zu wenig
Bedarf als das ich das jetzt programmieren wollte.

Gruß

Manuel

Patrick Rudin

unread,
Aug 1, 2021, 10:45:03 AMAug 1
to
Manuel Reimer wrote:
> Auf jeden Fall geht sowas mit Python und der "PIL" (Pillow) Library.

Ich hab heute nochmals ausgiebig gegoogelt und bin auf den Thread hier
gestossen:
https://www.gimp-forum.net/Thread-gpl-Palette-to-Image-Plugin-Script

Daraufhin mal das Script hier gezogen:
https://sourceforge.net/projects/gimp-tools/files/scripts/ofn-colormap-to-layer.zip/download

Python mag das auf der Kommandozeile nicht, weil das gimpfu-Modul fehlt.

In Gimp unter der Skript-Fu-Konsole ist es nicht auffindbar, obwohl es
im passenden Ordner liegt und Gimp die Skripte neu eingelesen hat.

Insofern...werde ich es wohl vorläufig weiterhin händisch machen, ist
auch nicht sonderlich tragisch....


Gruss

Patrick

Christian Garbs

unread,
Aug 1, 2021, 2:31:49 PMAug 1
to
Mahlzeit!
Ich habe ein Shellskript gebastelt, das die Palette SVG ausgibt:
https://github.com/mmitch/mitchscripts/blob/master/bash/gimp_palette_to_svg.sh

Vorteil: Einfach und verständlich, reiner Text, keine Library nötig.
Ich kenne das genaus GIMP-Palettenformat nicht und habe nur mit Deinem
Beispiel getestet.

Die Quadrat-Geschichte ist noch nicht drin, dafür müsste man die Datei
2x lesen oder alles in einem Array Zwischenspeichern. Vielleicht
kommt das, wenn mir nochmal langweilig ist ;-)

Zur Not kannst Du das aber auch erstmal fest ins Skript reinklimpern,
wenn Du vorher weißt, wieviele Spalten und Zeilen Du hast (if x > 128
then y=y+32; x=0 oder sowas in der Art).

Für die Umwandlung SVG nach PNG kannst Du dann Imagemagick nehmen.

Gruß
Christian
--
....Christian.Garbs....................................https://www.cgarbs.de
If you think you can beat me over the ear, you are on the woodway

Patrick Rudin

unread,
Aug 2, 2021, 7:14:00 AMAug 2
to
Christian Garbs wrote:
> Ich habe ein Shellskript gebastelt, das die Palette SVG ausgibt:
> https://github.com/mmitch/mitchscripts/blob/master/bash/gimp_palette_to_svg.sh

Wow, vielen Dank!

Ich habs leicht auf senkrecht abgeändert:

#!/bin/sh
#
# convert GIMP palette file to SVG image
#
# Copyright (C) 2021 Christian Garbs <mi...@cgarbs.de>
# licensed under GNU GPL v3 or later
#

size=32

if [ "$1" ]; then
exec < "$1"
fi

while read -r line; do
[ "$line" = '#' ] && break
done

x=0
y=0
cat <<EOF
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg">
EOF
while read -r r g b _; do
printf ' <rect x="%d" y="%d" width="%d" height="%d"
style="fill:rgb(%d,%d,%d);" />\n' $x $y $size $size "$r" "$g" "$b"
y=$(( y + size ))
done
echo '</svg>'

Das kommt im Beispiel dann mit einem convert -size 32x128 dann perfekt.

Insofern, das übersteigt leider bereits meine Syntaxkenntnisse: Wenn das
Skript gleich noch die konkrete Grösse ausgeben könnte, wäre das
perfekt, damit man für den convert-Befehl nicht noch rechnen muss..:-)

> Die Quadrat-Geschichte ist noch nicht drin, dafür müsste man die Datei
> 2x lesen oder alles in einem Array Zwischenspeichern. Vielleicht
> kommt das, wenn mir nochmal langweilig ist ;-)

Tob Dich ruhig aus, quadratisch wäre es noch ein wenig angenehmer zum
arbeiten. In der Praxis werde ich kaum mehr als 20 Farben in der Palette
haben.

Wer sich wundert, wozu man sowas überhaupt braucht: In Blender kann man
zwar gpl-Paletten importieren, aber die Zuweisung von Farben auf
einzelne Faces ist eher umständlich.

Viel rascher geht es, wenn man die Palette als Graphik im UV-Editor
bereitstellt und dann einfach beliebige Faces auf die Farben mappt.

Hochgeschwindigkeits-Youtuber Imphenzia zeigt die Technik hier ab Minute
2:12 bis 4:12.
https://www.youtube.com/watch?v=1jHUY3qoBu8


Gruss

Patrick

Christian Garbs

unread,
Aug 3, 2021, 3:22:31 PMAug 3
to
Mahlzeit!

Patrick Rudin <tax...@gmx.ch> wrote:
> Christian Garbs wrote:

>> Ich habe ein Shellskript gebastelt, das die Palette SVG ausgibt:
>> https://github.com/mmitch/mitchscripts/blob/master/bash/gimp_palette_to_svg.sh

[…]

> Das kommt im Beispiel dann mit einem convert -size 32x128 dann perfekt.
>
> Insofern, das übersteigt leider bereits meine Syntaxkenntnisse: Wenn das
> Skript gleich noch die konkrete Grösse ausgeben könnte, wäre das
> perfekt, damit man für den convert-Befehl nicht noch rechnen muss..:-)

Ich wollte schreiben „das kannst Du convert überlassen, wenn Du ihm
nur die Breite gibst, macht er die Höhe automatisch richtig“. Laut
Dokumentation ist das auch so, aber ich krieg das einfach nicht hin…


>> Die Quadrat-Geschichte ist noch nicht drin, dafür müsste man die Datei
>> 2x lesen oder alles in einem Array Zwischenspeichern. Vielleicht
>> kommt das, wenn mir nochmal langweilig ist ;-)
>
> Tob Dich ruhig aus, quadratisch wäre es noch ein wenig angenehmer zum
> arbeiten. In der Praxis werde ich kaum mehr als 20 Farben in der Palette
> haben.

Quadratisch ist jetzt drin, gleiche URL wie oben.

Ich habe versucht, im SVG die Größe mit anzugeben, damit convert
ohne -size passend konvertiert, aber es kümmert sich da nicht drum.
Mein 96x96 SVG wird in ein 101x101 PNG umgewandelt.

Ich gebe die Größe daher auf stderr aus. Mit dieser mittelschweren
Weiterverarbeitungskatastrophe sollte klappt es dann klappen, da
kriegt convert die Zielgröße komplett vorgekaut:

size=$(./gimp_palette_to_svg.sh foo.gpl 2>&1 >foo.svg)
convert -size $size foo.svg foo.png

Aber convert macht nur Müll! Egal ob -size, -resize oder -scale, das
PNG ist nicht pixelgenau, sondern interpoliert. Das liegt vermutlich
an der Koordinatenumrechnung SVG -> PNG. -size sieht noch am besten
aus, ist aber lustigerweise 1x1 Pixel größer als angegeben. Da werfe
ich jetzt aber das Handtuch, das scheint am SVG-Import von ImageMagick
zu liegen.

Kann Blender denn kein SVG importieren? ;-)


*überleg* Wäre es eventuell schlau, convert gleich noch aus dem Skript
aufzurufen?
Vorteil: Dann purzelt gleich ein PNG hinten raus.
Nachteil: Ohne convert geht dann nichts mehr. Und wenn man nicht in
eine Datei umleitet, hat man Binärmüll auf dem Terminal - das SVG ist
ja nur reiner Text.

Gruß
Christian
--
....Christian.Garbs....................................https://www.cgarbs.de
Was macht ein Bit am liebsten?
Ist doch klar: Bus fahren.

Patrick Rudin

unread,
Aug 4, 2021, 9:17:17 AMAug 4
to
Christian Garbs wrote:
> Ich wollte schreiben „das kannst Du convert überlassen, wenn Du ihm
> nur die Breite gibst, macht er die Höhe automatisch richtig“.

Das dachte ich zuerst auch, habe dann mit scale rumprobiert und Doku
gewälzt, irgendwann dann einfach mit size festgenagelt.

Ach, und mit einem Doppelklick im Dateimanager auf die SVG-Datei zeigt
der Bildbetrachter von Gnome natürlich auch die richtige Grösse an, der
verfügt halt über keine convert-Funktionalität...

> Quadratisch ist jetzt drin, gleiche URL wie oben.

Vielen Dank, das funktioniert perfekt. Wenn Du Dich in die
Blender-Innereien einliest, könntest Du das zum kostenpflichtigen Add-On
ausbauen, so etwa "Convert gpl-palettes directly into UV-maps in the
UV-Editor".

> Aber convert macht nur Müll! Egal ob -size, -resize oder -scale, das
> PNG ist nicht pixelgenau, sondern interpoliert.

Schon seltsam. Für meinen Anwendungsbereich ist das glücklicherweise
wurscht.

> Kann Blender denn kein SVG importieren? ;-)

Doch, in diesem Fall sogar recht intelligent: Er macht pro Farbe eine
Curve (also separates Objekt) mit passendem Materialslot, und die Base
Color setzt er auch grad richtig. Wenn man mehrere Objekte hat, die man
verschieden färben will, ist das perfekt.

Aber für UV-Mapping mag er kein SVG, da will er eine bitmap-Graphik.

> *überleg* Wäre es eventuell schlau, convert gleich noch aus dem Skript
> aufzurufen?

Vielleicht als Skriptvariante, ich finde das praktisch. Der
durchschnittliche Windows-User hingegen hat vermutlich kein Imagemagick
auf dem Rechner installiert, und wenn, dann auf abenteuerlichen Pfaden...


Gruss

Patrick

Sebastian Barthel

unread,
Aug 4, 2021, 4:57:47 PMAug 4
to
Am Tue, 03 Aug 2021 21:22:29 +0200 schrieb Christian Garbs:

> Mahlzeit!
>
> Patrick Rudin <tax...@gmx.ch> wrote:
>> Christian Garbs wrote:
>
>>> Ich habe ein Shellskript gebastelt, das die Palette SVG ausgibt:
>>> https://github.com/mmitch/mitchscripts/blob/master/bash/
gimp_palette_to_svg.sh
>
> […]
>
>> Das kommt im Beispiel dann mit einem convert -size 32x128 dann perfekt.
>>
>> Insofern, das übersteigt leider bereits meine Syntaxkenntnisse: Wenn
>> das Skript gleich noch die konkrete Grösse ausgeben könnte, wäre das
>> perfekt, damit man für den convert-Befehl nicht noch rechnen muss..:-)
>
> Ich wollte schreiben „das kannst Du convert überlassen, wenn Du ihm nur
> die Breite gibst, macht er die Höhe automatisch richtig“. Laut
> Dokumentation ist das auch so, aber ich krieg das einfach nicht hin…
>
>
>>> Die Quadrat-Geschichte ist noch nicht drin, dafür müsste man die Datei
>>> 2x lesen oder alles in einem Array Zwischenspeichern. ...
>> Tob Dich ruhig aus, quadratisch wäre es noch ein wenig angenehmer zum
>> arbeiten.
>
> Quadratisch ist jetzt drin, gleiche URL wie oben.
>
> Ich habe versucht, im SVG die Größe mit anzugeben, damit convert ohne
> -size passend konvertiert, aber es kümmert sich da nicht drum. Mein
> 96x96 SVG wird in ein 101x101 PNG umgewandelt.
>
> Ich gebe die Größe daher auf stderr aus. Mit dieser mittelschweren
> Weiterverarbeitungskatastrophe sollte klappt es dann klappen, da kriegt
> convert die Zielgröße komplett vorgekaut:
>
> size=$(./gimp_palette_to_svg.sh foo.gpl 2>&1 >foo.svg)
> convert -size $size foo.svg foo.png
>
> Aber convert macht nur Müll! Egal ob -size, -resize oder -scale, das
> PNG ist nicht pixelgenau, sondern interpoliert. ...

> *überleg* Wäre es eventuell schlau, convert gleich noch aus dem Skript
> aufzurufen?
> Vorteil: Dann purzelt gleich ein PNG hinten raus.
> Nachteil: Ohne convert geht dann nichts mehr. Und wenn man nicht in
> eine Datei umleitet, hat man Binärmüll auf dem Terminal - das SVG ist ja
> nur reiner Text.


Da habt ihr ja was lustiges gebaut. Idee und Umsetzung super - fehlt
jetzt noch das Marketing. Das findet im Usenet so absolut überhaupt
niemand, der das evtl. benutzen will.


Ich habe das auch mal mit dem convert probiert - das ist wirklich
komisch. Da kommen 63x64 oder 52x53 als Größen raus. Und auch -geometry -
scale o.ä. bringen nicht soviel - und auch hinterher bekommt man das
nicht "hingebogen".

Aber:

inkscape kann SVG Import und läßt Kommandlinebedienung zu

mit

-e, --export-png=FILENAME

mutiert das zum Filter und da funktioniert das ganz prima

also

'inkscape -e fileout.png filein.svg'

macht da ein schönes 64x64 Bit Quadrat mit 32 px Unterquadraten draus


Gruß, SBn

Christian Garbs

unread,
Aug 6, 2021, 4:31:08 PMAug 6
to
Mahlzeit!

Thomas Noll <-_tn...@web.de> wrote:
> Am Tue, 3 Aug 2021 21:22:29 +0200 (CEST) schrieb Christian Garbs:

>> Vorteil: Dann purzelt gleich ein PNG hinten raus.
>> Nachteil: Ohne convert geht dann nichts mehr. Und wenn man nicht in
>> eine Datei umleitet, hat man Binärmüll auf dem Terminal - das SVG ist
>> ja nur reiner Text.
>
> Nimm doch ppm als P3. Bitmap, reiner Text, plain bash ohne
> irgendwelche Tools, nur ein paar Schleifen wird es wohl brauchen ;)

Möh, ich fand das mit dem SVG zu schön... Aber Du hast natürlich
Recht :) Und weil das Format pixelgenau hochskaliert werden kann,
reicht ein Pixel pro Farbe, ich muss gar keine Kästen malen.

Das war so einfach umzubauen, dass ich schon einen Schalter zur
Auswahl von PPM oder SVG einbauen wollte. Dann sah ich aber, dass ich
"to_svg" im Dateinamen hatte, also gibt es jetzt ein "..._to_ppm.sh":

https://github.com/mmitch/mitchscripts/blob/master/bash/gimp_palette_to_ppm.sh

Das Ergebnis kann man in convert reinkippen und mit -scale kriegt man
es ohne Interpolation skaliert:

$ ./gimp_palette_to_ppm.sh /usr/share/inkscape/palettes/Android-icon-palette.gpl | convert -scale 32x32 - foo.png

Jetzt kommt es wieder auf Blender an:

- kann er PPM direkt einlesen?
- kann er das intern hochskalieren?

Gruß
Christian
--
....Christian.Garbs....................................https://www.cgarbs.de
Customer: "I'm using Windows 95" Tech Support: "Yes..."
Customer: "My computer isn't working now" Tech Support: "Yes, you said that"

Patrick Rudin

unread,
Aug 7, 2021, 3:40:55 AMAug 7
to
Christian Garbs wrote:
> Jetzt kommt es wieder auf Blender an:
>
> - kann er PPM direkt einlesen?

Nein, leider nicht. Schon der SVG-Import ist ein Add-on.

Die Liste der unterstützten Formate ist recht übersichtlich:
https://docs.blender.org/manual/en/dev/files/media/image_formats.html


Gruss

Patrick

Christian Garbs

unread,
Sep 9, 2021, 2:37:41 PMSep 9
to
Mahlzeit!

Thomas Noll <-_tn...@web.de> wrote:
> Am Fri, 6 Aug 2021 22:31:07 +0200 (CEST) schrieb Christian Garbs:
>
>> https://github.com/mmitch/mitchscripts/blob/master/bash/gimp_palette_to_ppm.sh
>
> 3 Anmerkungen:
> - color_depth sollte color_max heißen und auf 255 stehen

Jepp - das habe ich soeben korrigiert.

> - Das x,y Geraffel ist jetzt überflüssig

Das ist Absicht, damit das noch so aussieht wie das andere Skript.
Aber ja, das kann eigentlich weg.

> - Man könnte beim Quadrat die letzte Zeile weglassen, wenn sie
> komplett leer ist

Dann ist es aber kein Quadrat mehr und das war die User-Story WIMRE ;-)

Gruß
Christian
--
....Christian.Garbs....................................https://www.cgarbs.de
"I was just doing what the recipe said to do!"
Reply all
Reply to author
Forward
0 new messages