zur Übersicht nächste Seite

Ein wenig ImageMagick

Es werden hier die Ausführungen von der Seite "Programmschleifen" fortgeführt. Zunächst erzeugt man in dem Ordner BlaBla einen Unterordner:
mkdir ~/Bla/Nur/BlaBla/Oder
(im Terminal eingeben und Eingabetaste drücken)
Dann kopiert man die Datei bsp01.gif aus dem Ordner BlaBla in diesen Unterordner
cp ~/Bla/Nur/BlaBla/bsp01.gif ~/Bla/Nur/BlaBla/Oder
(im Terminal eingeben und Eingabetaste drücken)
Dann kopiert man die  Zahl*.png-Bilder  aus dem Ordner BlaBla in diesen Unterordner
cp ~/Bla/Nur/BlaBla/Z*.png ~/Bla/Nur/BlaBla/Oder
(im Terminal eingeben und Eingabetaste drücken)
Dann wird der Eingabeprompt in diesen Ordner verlegt
cd ~/Bla/Nur/BlaBla/Oder
(im Terminal eingeben und Eingabetaste drücken)
Damit werden alle Eingaben direkt in diesem Ordner ausgeführt. Die weiteren auf dieser Seite aufgeschriebenen Terminal-Eingaben auf den weißen Feldern sind so zu verstehen daß der Eingabeprompt des Terminals in diesem Ordner
~/Bla/Nur/BlaBla/Oder
liegt und daß die Zeichen aus den weißen Feldern im Terminal eingefügt werden und die Eingabetaste gedrückt wird.

Die Datei bsp01.gif wurde durch 20  Zahl*.png-Bilder  erzeugt. Das png-Format ist bei der Arbeit mit ImageMagick sehr zu empfehlen, da es viele Bildinformationen speichert und mit der Transparenz besser umgeht als das gif-Format (es gibt auch ein ImageMagick-eigenes Bildformat das noch mehr Informationen speichert). Für das Internet ist das png-Format nicht vorteilhaft (Browser unterstützen es oft nicht) daher wird man am Ende der Bildbearbeitungs-Schritte zum Speichern das jpg-Format oder das gif-Format verwenden, aber nicht während der Bildbearbeitungs-Schritte. Zum beispielhaften Anzeigen von png-Dateien auf dieser Seite wird daher auch jpg oder gif verwendet. 

Bei der Erzeugung von bsp01.gif hat convert die 20  Zahl*.png-Bilder  in einen internen Speicher eingelesen, eine durchnummerierte Liste für diese Bilder erstellt - beginnend mit index0 bis index19 - und dann eine GIF-Animation erzeugt indem die Bilder der Reihe nach angezeigt werden. Man kann die Bilder der einzelnen gif-frames wieder herausziehen, z.B. mit zweistelliger Nummerierung.
convert bsp01.gif Y%02d.png
Man kann die gif-frames aneinanderkleben und als Einzelbild abspeichern
convert bsp01.gif +append b01.png

Übersichtlicher wird es in der folgenden Form (die auch mögliche transparente Teile beibehält)
convert -dispose background bsp01.gif -matte -compose Copy -bordercolor blue -border 1x1 -compose Over -coalesce -bordercolor none -frame 1x1 -compose Copy -bordercolor yellow -border 1x1 +append b02.png

Auch eine Blockbildung mit dem montage-Befehl kann die Übersicht verbessern. Dann lassen sich die frames leichter abzählen
montage bsp01.gif -coalesce -tile 5x -geometry '+2+2' -background blue b03.png

Informationen über die einzelnen frames von bsp01.gif kann man erhalten durch Eingabe von
identify -format "%f canvas=%Wx%H size=%wx%h offset=%X%Y %D %Tcs\n" bsp01.gif
Im Terminal wird ausgegeben
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs
bsp01.gif canvas=30x30 size=30x30 offset=+0+0 Undefined 50cs

Wenn man auf bsp01.gif im Dateisystem einen Rechtsklick macht so sieht man die Dateigröße
12,6 kB (12.632 Bytes)
Nun gibt es innerhalb von ImageMagick eine Möglichkeit der automatischen Optimierung. Besser wäre es natürlich diesen Optimierungsprozess nach dem Einlesen der 20 Zahl*.png-Bilder durchzuführen, da das gif-Format bereits Informationsverluste beinhalten kann
convert Z*.png -layers optimize -set delay 50 -loop 0 bsp11.gif
Bei diesem Beispiel ist das gleichgültig
convert bsp01.gif -layers optimize bsp11.gif
Wenn man auf bsp11.gif im Dateisystem einen Rechtsklick macht so sieht man die Dateigröße
4,7 kB (4.655 Bytes)
Dies ist eine gewaltige Einsparung. Was dabei passiert ist sieht man z.B. mit
convert -dispose background bsp11.gif -matte -compose Copy -bordercolor blue -border 1x1 -compose Over -coalesce -bordercolor none -frame 1x1 -compose Copy -bordercolor yellow -border 1x1 +append b04.png



Es wurden die Veränderungen von Bild zu Bild herausgesucht und in kleineren Bildern (diejenigen mit blauer Umrandung) mit Versatzwerten (offset) zur Überlagerung gebracht. Die genauen offset-Werte sieht man z.b. mit
identify -format "%f canvas=%Wx%H size=%wx%h offset=%X%Y %D %Tcs\n" bsp11.gif
Im Terminal wird ausgegeben
bsp11.gif canvas=30x30 size=30x30 offset=+0+0 None 50cs
bsp11.gif canvas=30x30 size=12x16 offset=+14+7 None 50cs
bsp11.gif canvas=30x30 size=12x16 offset=+14+7 None 50cs
bsp11.gif canvas=30x30 size=12x16 offset=+14+7 None 50cs
bsp11.gif canvas=30x30 size=12x16 offset=+14+7 None 50cs
bsp11.gif canvas=30x30 size=12x17 offset=+14+6 None 50cs
bsp11.gif canvas=30x30 size=12x18 offset=+14+5 None 50cs
bsp11.gif canvas=30x30 size=12x18 offset=+14+5 None 50cs
bsp11.gif canvas=30x30 size=11x16 offset=+14+7 None 50cs
bsp11.gif canvas=30x30 size=11x17 offset=+14+7 None 50cs
bsp11.gif canvas=30x30 size=24x17 offset=+2+7 None 50cs
bsp11.gif canvas=30x30 size=12x16 offset=+14+7 None 50cs
bsp11.gif canvas=30x30 size=12x16 offset=+14+7 None 50cs
bsp11.gif canvas=30x30 size=12x16 offset=+14+7 None 50cs
bsp11.gif canvas=30x30 size=12x16 offset=+14+7 None 50cs
bsp11.gif canvas=30x30 size=12x17 offset=+14+6 None 50cs
bsp11.gif canvas=30x30 size=12x18 offset=+14+5 None 50cs
bsp11.gif canvas=30x30 size=12x18 offset=+14+5 None 50cs
bsp11.gif canvas=30x30 size=11x16 offset=+14+7 None 50cs
bsp11.gif canvas=30x30 size=11x17 offset=+14+7 None 50cs

Die Veränderungsbilder kann man auch aus dem bsp11.gif herausziehen durch
convert bsp11.gif R%02d.png
Auch wenn die Reduzierung der Dateigröße durch bsp11.gif beeindruckend ist, läßt sich mit Reduzierung der Anzahl der Farben noch weiteres erreichen. Zunächst schaut man sich die verwendeten Farben z.B. bei dem frame mit index0 von bsp01.gif - also der Datei Y00.png - an. Dies ist möglich durch
convert Y00.png -format %c -depth 8 histogram:info:-
Es sind erstaunlich viele Farben beteiligt wenn man bedenkt daß auf dem roten Hintergrund schwarze Zahlen geschrieben wurden (also 2 Farben benutzt wurden). Dies liegt daran daß bei dem Schreiben der Zahlen im Randbereich gemischte Farbabstufungen benutzt wurden um die Konturen weich und rund zu gestalten. Man kann die Anzahl der Farben reduzieren - etwa indem man 2 Farben erzwingt
convert Y00.png -colors 2 b05.gif
Die Farb-Übersicht 
convert b05.gif -format %c -depth 8 histogram:info:-
zeigt daß jetzt nur noch 2 Farben vorhanden sind. Aber die schwarzen Zahlen haben extrem unschöne Treppeneffekte am Rand. Recht gute Optik erhält man mit 16 Farben
convert Y00.png -colors 16 b06.gif

b06.gif             Vergrößerung von b06.gif 
b05.gif             Vergrößerung von b05.gif 

Die Anzahl der Farben muß man ausprobieren und persönlich entscheiden. Schaut man sich jetzt die Frame-Farb-Übersicht bei bsp01.gif an (das gif-Format kann 256 Farben benutzen)
identify -format "Colors in Frame %p: %k\n" bsp01.gif
so sieht man daß jeder frame seine eigene Farbpalette hat. Das ist auch sinnvoll denn es können ganz unterschiedliche Bilder bei der Animation gezeigt werden. Wenn aber wie bei diesem Beispiel die Farben nicht stark abweichen, so könnte man eine gemeinsame Farbpalette für alle 20 frames zugrundelegen - z.B. mit 16 Farben. Dies würde gewaltige Informationen einsparen. Und anschließend kann man noch die frame-Optimierung laufen lassen. Dies ist möglich mit
convert \( bsp01.gif \( -clone 0--1 -background none +append -quantize transparent -colors 16 -unique-colors -write mpr:palette +delete \) -map mpr:palette \) -layers optimize bsp51.gif
Wenn man auf bsp51.gif im Dateisystem einen Rechtsklick macht so sieht man die Dateigröße
2,7 kB (2.666 Bytes)

Sofern keine transparenten oder halb-transparenten pixel in den frames vorkommen kann man auch eine einfachere Variante benutzen 

convert \( bsp01.gif \( -clone 0--1 +append -colors 16 -write mpr:palette +delete \) -map mpr:palette \) -layers optimize bsp51.gif

Man hat direkten Einfluß auf die einzelnen frames einer Animation. Löschen kann man frames über -delete und Angabe der index-Nummer. Mit
convert bsp01.gif -delete 19 bsp53.gif
löscht man den frame 19. Oder gleich mehrere frames, hier 7-19 und 0
convert bsp01.gif -delete 7-19,0 bsp54.gif

    

Mit +delete löscht man das zuletzt eingelesene frame (das mit höchster index-Nummer). 
Nun wird noch eine weitere Animation erzeugt (mit anderer Anzeigedauer, aber in der gleichen Bildgröße)
convert -size 30x30 -background green -gravity center -fill black -font FreeSerif -pointsize 36 label:A C0.png

convert -size 30x30 -background green -gravity center -fill black -font FreeSerif -pointsize 36 label:B C1.png

convert C*.png -set delay 100 -loop 0 bsp55.gif

   
Man kann bei gleicher Bildgröße Animationen hintereinanderhängen.  Dabei bleiben auch die unterschiedlichen delay-Werte der frames erhalten. Z.B.
convert bsp54.gif bsp55.gif bsp56.gif

   
Beliebige frames kann man tauschen mit -swap z.B. -swap 7,2 tauscht index7 mit index2 (index-Zählung beginnt mit 0)
convert bsp56.gif -swap 7,2 bsp57.gif

   
Bei +swap werden die letzten beiden frames getauscht. Durch -reverse wird die gesamte Reihenfolge umgedreht
convert bsp56.gif -reverse bsp58.gif

   
Man kann zusätzliche frames einfügen mit -insert und Angabe der index-Stelle, z.B. -insert 1 bedeuted daß das neue frame nach index 0 eingefügt wird und das alte frame mit index 1 jetzt den index 2 erhält, und entsprechend alle nachfolgenden frames im index erhöht werden. Allerdings hat das neu eingefügte frame keine zeitlichen Anzeigevorgaben, daher muß man diese neu setzen
convert bsp54.gif -delay 200 C0.png -insert 1 bsp59.gif

   
Mit +insert wird das letzte frame an die erste Stelle gesetzt, das letzte frame erhält den index 0 und bei allen anderen frames wird der index um eins erhöht (delay bleibt erhalten).

Man kann gezielt einzelne frames bearbeiten mit 
\( -clone [index] [Veränderung] \) 
Damit die Veränderung nur auf das gewünschte frame wirkt muß die Angabe in maskierte Klammern gesetzt werden \( \) Auch der clone-Operator selbst erfordert diese Klammern. Dann wird ein clone vom gewünschten frame mit der entsprechenden index-Nummer erzeugt und auf diesen wirken die Änderungen (delay bleibt erhalten)
convert bsp56.gif \( -clone 6 -flip \) \( -clone 0-2 \) \( -clone 7 -rotate 270 \) bsp60.gif

   
Die neuen clone-frames werden hinter die anderen vorher bestehenden frames gesetzt.  Will man nun ein frame durch das veränderte ersetzen kann man -swap verwenden um die Reihenfolge von alter und neuer Version zu tauschen und dann mit +delete das alte zu löschen. Setzt man hinter -swap nur eine Index-Nummer so wird das letzte frame mit dem der Index-Nummer getauscht.
convert bsp56.gif \( -clone 6 -shade 110x50 \) -swap 6 +delete \( -clone 0 -modulate 100,100,166 \) -swap 0 +delete \( -clone 3 -colorize 40% \) -swap 3 +delete bsp61.gif

   

zur Übersicht nächste Seite

Datenschutzerklärung
Impressum