zur Übersicht nächste Seite

imagemagick Teil4

Generell gilt bei den weißen Textstellen auf dieser Seite: Man fügt die Zeichenfolge aus dem weißen Feld bei dem blinkenden Cursor des Terminals ein - dann drückt man die Eingabetaste.

Es werden hier nur einige Informationen von der ImageMagick-Internetseite übersetzt. Für eine komplette Dokumentation bitte dort nachschauen.

Es werden die Dateien 
deb6510.jpg
deb6511.jpg
von der vorhergehenden Seite benutzt, sowie die Datei
deb66A1.jpg

Man kann -composite mit zwei Bildern verwenden und damit die Bilder übereinanderlegen mit Verwendung von Positions-Werten 
convert deb6510.jpg \( deb66A1.jpg -crop 48x48+144+67 +repage \) -geometry +90+50 -composite deb6600.jpg

Nun stellt sich die Frage wie man mittig Rechtecke aufziehen kann die immer größer werden und schließlich den ganzen Raum von deb6510.jpg ausfüllen. Die Vergrößerung der Rechtecke soll jeweils 4 pixel umlaufend betragen.
Dazu muß man ein wenig rechnen. Die Breite des Bildes beträgt 200 pixel, also 200/8=25
Die Höhe des Bildes beträgt 145 pixel, also 145/8=18,1
Also kann man 18 Rechtecke aufziehen. Es verbleibt ein Anfangsrechteck 56x1+72+72
for i in {0..18}; do let d=56+i*8; let e=1+i*8; let f=72-i*4; let i=i+1; convert deb6510.jpg \( deb6511.jpg -crop $d\x$e+$f+$f \) -geometry +$f+$f -composite +depth miff:- ; done | montage - -tile 5x -geometry +6+6 -background black x:

Nun möchte man daraus ein gif machen indem die Bildfolge einmal vorwärts und einmal rückwärts abgespielt wird.
Um Verluste durch Abspeichern in Zwischenschritten zu vermeiden wird ein Datenstrom erzeugt der das gif-Bild in einer Zeile fertigstellt:
Die Bilder mit den aufgezogenen Rechtecken werden mit einer Anzeigedauer von 8cs versehen und in einem Datenstrom gesammelt.

Dann wird der Datenstrom durch eine pipe | geschickt.

Dann werden Anzeigedauern vergrößert und Bilder in umgekehrter Reihenfolge angehängt
Dann wird eine Optimierung mit
-layers optimize
durchgeführt und alles als deb6665.gif abgespeichert
for i in {0..18}; do let d=56+i*8; let e=1+i*8; let f=72-i*4; let i=i+1; convert deb6510.jpg \( deb6511.jpg -crop $d\x$e+$f+$f \) -geometry +$f+$f -composite -set delay 8 -loop 0 +depth miff:- ; done | convert deb6510.jpg - \( -clone 19 -set delay 80 \) -swap 19 +delete \( -clone 0 -set delay 80 \) -swap 0 +delete \( -clone 1--2 -reverse \) -layers optimize deb6665.gif

Das enstandene gif hat eine Größe von 121 kB.
Ohne die Optimierung mit -layers optimize wäre die Größe 1,1 MB.
Man könnte durch Verkleinerung der Farbpalette leicht weniger als 100 kB erreichen, aber je kleiner die Farbpalette ist umso schlechter ist der optische Eindruck. Generell ist es so daß zuerst -layers optimize durchgeführt werden sollte und möglicherweise anschließend eine Verkleinerung der Farbpalette.
Hier ein Beispiel mit 16 Farben
for i in {0..18}; do let d=56+i*8; let e=1+i*8; let f=72-i*4; let i=i+1; convert deb6510.jpg \( deb6511.jpg -crop $d\x$e+$f+$f \) -geometry +$f+$f -composite -set delay 8 -loop 0 +depth miff:- ; done | convert deb6510.jpg - \( -clone 19 -set delay 80 \) -swap 19 +delete \( -clone 0 -set delay 80 \) -swap 0 +delete \( -clone 1--2 -reverse \) -layers optimize +depth miff:- | convert - \( -clone 0--1 +append -colors 16 -write mpr:palette +delete \) -map mpr:palette deb6675.gif

Das enstandene deb6675.gif hat eine Größe von 68 kB.

Was aber macht -layers optimize
convert deb6665.gif +depth miff:- | montage - -tile 5x -geometry +6+6 -background black x:

Es werden die Veränderungen von einem Bild zum nächsten herausgesucht. Dies sind die 4pixel-breiten Rahmen und diese werden mit Versatzwerten daraufgelegt. Die pixel innerhalb der Rahmen sind nicht mehr vorhanden, es werden nur Rahmen aufeinandergelegt.



Benutzt man -composite mit drei Bildern so wird das erste Bild als darunterliegendes Bild (destination) behandelt. Das zweite Bild wird als darüberliegendes Bild ( source ) behandelt. Das dritte Bild wird als Maske behandelt. Sofern die Maske nur aus schwarzen und weißen pixeln besteht zeigen die schwarzen pixel das darunterliegende Bild und die weißen pixel das darüberliegende Bild.

Also macht man eine Folge von Masken beginnend mit schwarz und endend mit weiß und bastelt daraus ein animiertes gif.
for i in {1..12}; do let d=i*4; let e=24-i*2; let i=i+1; convert -size 48x48 xc:black -size $d\x$d xc:white -geometry +$e+$e -composite +depth miff:- ; done | montage - -tile 5x -geometry +6+6 -background khaki x:

Man kann mit tile: Flächen aus Kacheln erzeugen
for i in {1..12}; do let d=i*4; let e=24-i*2; let i=i+1; convert -size 48x48 xc:black -size $d\x$d xc:white -geometry +$e+$e -composite -write mpr:$i +delete -size 200x145 tile:mpr:$i +depth miff:- ; done | montage - -tile 5x -geometry +6+6 -background khaki x:

Es wird wieder ein Datenstrom erzeugt der das gif-Bild in einer Zeile fertigstellt
for i in {1..12}; do let d=i*4; let e=24-i*2; let i=i+1; convert -size 48x48 xc:black -size $d\x$d xc:white -geometry +$e+$e -composite -write mpr:$i +delete -size 200x145 tile:mpr:$i -write mpr:W$i +delete deb6510.jpg deb6511.jpg mpr:W$i -composite -set delay 8 -loop 0 +depth miff:- ; done | convert deb6510.jpg - \( -clone -1 -set delay 80 \) +swap +delete \( -clone 0 -set delay 80 \) -swap 0 +delete \( -clone 1--2 -reverse \) -layers optimize deb6620.gif

Man kann sich wieder anschauen was -layers optimize macht

Eine andere Möglichkeit für eine Maske: 
Man kann ein Bild mit Verlaufsfarben erzeugen, wie z.B. das links gezeigte
deb6631.jpg
Davon lassen sich passende Größen ausschneiden.
Mit -negate erzeugt man ein Negativ. 
Mit -threshold Wert% werden pixel entweder zu weiß oder schwarz. Dabei sind für Wert die Zahlen zwischen 0 und 100 möglich. 
for m in {1..19} ; do let m=m+1; let n=100-5*m; convert -size 300x300 radial-gradient: -negate -crop 200x145+0+110 +repage -threshold $n% +depth miff:- ; done | montage - -tile 5x -geometry +6+6 -background khaki x:

Es wird wieder ein Datenstrom erzeugt der das gif-Bild in einer Zeile fertigstellt
for m in {1..19} ; do let m=m+1; let n=100-5*m; convert deb6510.jpg deb6511.jpg \( -size 300x300 radial-gradient: -negate -crop 200x145+0+110 +repage -threshold $n% \) -composite +depth miff:- ; done | convert deb6510.jpg - \( -clone -1 -set delay 80 \) +swap +delete \( -clone 0 -set delay 80 \) -swap 0 +delete \( -clone 1--2 -reverse \) -layers optimize deb6630.gif

Man kann mit threshold jedes Bild bearbeiten, es muß kein Graustufenbild sein. Hier wird das erste Bild auf dieser Seite benutzt, deb66A1.jpg
Sind zwei threshold-Bilder ganz ähnlich so wird in der Animation kaum eine Änderung zu sehen sein. Daher ist es gut wenn man herumprobiert und eine Auswahl benutzt
for i in 0 5 10 15 20 25 30 40 55 100 ; do convert deb66A1.jpg -threshold $i% +depth miff:-; done | montage - -tile 5x -geometry +6+6 -background red x:

Es wird wieder ein Datenstrom erzeugt der das gif-Bild in einer Zeile fertigstellt
for i in 0 5 10 15 20 25 30 40 55 100 ; do convert deb6510.jpg deb6511.jpg \( deb66A1.jpg -threshold $i% \) -composite -set delay 8 -loop 0 +depth miff:- ; done | convert - \( -clone 9 -set delay 80 \) -swap 9 +delete \( -clone 0 -set delay 80 \) -swap 0 +delete \( -clone 1--2 -reverse \) -layers optimize deb6680.gif


zur Übersicht nächste Seite

Datenschutzerklärung
Impressum