zur Übersicht nächste Seite

imagemagick Teil5

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 soll wieder das Zahlengif deb6464.gif mit den sechs Zahlen
(Anzeigedauer von 50 cs) von den vorhergehenden Seiten angesprochen werden.

Es soll nun die Anzeigedauer der Bilder auf 23 cs gesetzt werden aber für das 4.Bild mit index-Nr. 3 soll die Anzeigedauer auf 200 cs gesetzt werden. Außerdem soll das 2.Bild mit index-Nr. 1 um 180 Grad gedreht werden.
Einzelne Bilder lassen sich mittels \( -clone Speicher-Nummer \) bearbeiten.
Auch eine Bearbeitung mit dem mpr-Zwischenspeicher ist möglich:
Bilder einlesen und für alle die Anzeigedauer auf 23 cs setzen, dann alle Bilder in den mpr-Speicher werfen und Datenstrom löschen. Dann einzelne Bilder aus dem mpr-Speicher aufrufen und bearbeiten und wieder in den mpr-Speicher werfen und Datenstrom löschen. Dann die Bilder in der richtigen Reihenfolge aus dem Speicher nehmen (loop 0 ist bereits vom Eingangs-gif gespeichert)

convert deb6464.gif -set delay 23 -write mpr:23 -delete 0--1 mpr:23[1] -rotate 180 -write mpr:Dreh +delete mpr:23[3] -set delay 200 -write mpr:200 +delete mpr:23[0] mpr:Dreh mpr:23[2] mpr:200 mpr:23[4] mpr:23[5] Bearbeitet.gif

Aber es gibt noch eine Möglichkeit bei der die index-Nr. mit der "Variablen" t direkt angesprochen wird
'%[fx:t == 3 ? 200 : 23]' bedeuted: Bei index-Nr.3, steht dort der Wert 200, bei anderen index-Nr. der Wert 23
'%[fx:t == 1 ? 180 : 0]' bedeuted: Bei index-Nr.1, steht dort der Wert 180, bei anderen index-Nr. der Wert 0
convert deb6464.gif -distort SRT '%[fx:t == 1 ? 180 : 0]' -set delay '%[fx:t == 3 ? 200 : 23]' +depth miff:- | montage - -tile 6x -geometry +6+6 -background black x:

Genauere Informationen
convert deb6464.gif -distort SRT '%[fx:t == 1 ? 180 : 0]' -set delay '%[fx:t == 3 ? 200 : 23]' +depth miff:- | identify -format "%p canvas=%Wx%H size=%wx%h offset=%X%Y %D %Tcs\n" -
0 canvas=30x30 size=30x30 offset=+0+0 Undefined 23cs
1 canvas=30x30 size=30x30 offset=+0+0 Undefined 23cs
2 canvas=30x30 size=30x30 offset=+0+0 Undefined 23cs
3 canvas=30x30 size=30x30 offset=+0+0 Undefined 200cs
4 canvas=30x30 size=30x30 offset=+0+0 Undefined 23cs
5 canvas=30x30 size=30x30 offset=+0+0 Undefined 23cs

Mit %[fx:] kann man auch mathematische Funktionen verwenden. Unter anderem gibt es folgende Bezeichnungen:
w=Breite des Bildes
h=Höhe des Bildes
n=Anzahl der Bilder
t=Index des Bildes.

-distort SRT ist ein sehr umfangreicher Veränderungs-Operator. Sofern nur ein Wert notiert wird handelt es sich um eine Rotation. Wird nun ein Viereck rotiert so ragen die Ecken über den Bildbereich hinaus und andere Teile des Bildbereiches bleiben leer. Die pixel außerhalb des gedrehten Viereckes bezeichnet man als virtuelle pixel. Ohne weitere Angaben werden Standard-Vorgaben benutzt, hier die Fortsetzung der Randpixel. Man kann die Standard-Vorgaben ändern, z.B. die virtuellen pixel schwarz machen
convert deb6464.gif -virtual-pixel Black -distort SRT '%[fx:10+60*t/n]' +depth miff:- | montage - -tile 6x -geometry +6+6 -background black x:

Von den Vierecken ist nicht mehr viel zu sehen. Man kann den Bereich der virtuellen pixel vergrößern.
convert deb6464.gif -virtual-pixel Black -set option:distort:viewport 50x50-10-10 -distort SRT '%[fx:10+60*t/n]' +depth miff:- | montage - -tile 6x -geometry +6+6 -background black x:

Da es sich um virtuelle pixel handelt sind die Versatzwerte mit einem Minus-Zeichen zu setzen.

Diese virtuellen pixel sind manchmal extrem notwendig haben aber auch eigene Möglichkeiten.
Hier wird das Bild hz75.png verwendet:

Jetzt werden virtuelle pixel dazugegeben.
convert hz75.png -virtual-pixel white -set option:distort:viewport 120x120-42-42 +depth miff:- | montage - -tile 1x -geometry +6+6 background khaki x:

Diese sind zunächst nicht sichtbar.
Auch beim Abspeichern in ein Dateiformat sind die virtuellen pixel nicht sichtbar. Diese werden erst bei einem distort-Befehl aktiviert. Der einfachste distort Befehl ist
-distort SRT '0'
Es bedeuted eine Drehung um den Winkel 0. Also wird eigentlich gar nichts gemacht aber als distort-Befehl aktiviert er die virtuellen pixel. Wenn man sich pixel als kleine quadratische Farbflächen vorstellt so ist das Verschieben eines pixel an eine gedrehte Stelle schwierig. Man betrachtet eine Umgebung dieses pixels und berechnet mit einem filter welche bestmöglichen pixel in die Umgebung der gedrehten Stelle passen. Bei einem Drehen um den Winkel 0 werden auch die Umgebungspixel herangezogen und die bestmögliche Wahl berechnet. Daher ist auch eine kleine Unschärfe des um den Winkel 0 gedrehten Bildes zu beobachten.
Es ist auch sinnvoll
-filter point
anzufügen da hierdurch die Verwendung von zusätzlichen Filtern vermieden wird.
convert hz75.png -virtual-pixel white -set option:distort:viewport 120x120-42-42 -filter point -distort SRT '0' +depth miff:- | montage - -tile 1x geometry +6+6 background khaki x:

Jetzt sieht man die weißen virtuellen pixel. Und man sieht daß das Herz mit 33x32 pixel ziemlich gut in der Mitte positioniert ist.

Diese virtuellen pixel lassen sich auch in anderen Varianten anzeigen. Z.B.
convert hz75.png -set option:distort:viewport 120x120-42-42 -filter point -virtual-pixel horizontaltile -distort SRT '0' deb6709.png

Wenn man nun dieses Bild dreht so entstehen Überlappungen, die eine Spur erzeugen und damit ein Muster malen.

Zu Beginn der Dreh-Überlagerungen ist dieses Muster noch nicht zu sehen, deshalb kann man alle gedrehten Bilder gruppieren und dies als Anfangsbild positionieren
convert hz75.png -set option:distort:viewport 120x120-42-42 -filter point -duplicate 29 -virtual-pixel horizontaltile -background none -distort SRT '%[fx:360*t/n]' \( -clone 0--1 +repage -background none -flatten \) -insert 0 -delete -1 -set delay 10 -loop 0 deb6714.gif

Man kann das Herz anders positionieren
convert -size 120x120 xc:none hz75.png -geometry +0+44 -composite deb6715.gif

Wenn man die Überlappungsspuren nicht sehen will so kann man -dispose background verwenden
convert -dispose background deb6715.gif -duplicate 29 -virtual-pixel transparent -distort SRT '%[fx:12*t]' -set delay 10 -loop 0 deb6716.gif

Möchte man dieses transparente gif auf ein anderes Bild legen so muß man allerdings -dispose previous nutzen denn das andere Bild soll natürlich weiterhin zu sehen sein. Für eine Positionierung kann man das Bild mit virtuellen pixeln aufblasen.

Es wird das Bild deb6510.jpg von den vorhergehenden Seiten verwendet
convert deb6510.jpg -dispose previous \( deb6716.gif -set option:distort:viewport 200x145-76-0 -filter point -virtual-pixel transparent -distort SRT '0' \) -set delay '%[fx:t == 0 ? 100 : 10]' deb6718.gif

Es wird das Bild deb6720.png mit 50x50 pixel verwendet

Die virtuellen pixel werden wieder anders angezeigt
convert deb6720.png -set option:distort:viewport 190x190-70-70 -virtual-pixel mirror -filter point -distort SRT '0' deb6721.png

Wird SRT mit zwei Werten benutzt so ist der erste Wert eine Vergrößerung/Verkleinerung und der zweite Wert eine Drehung.
SRT '.8 45' bedeuted eine Verkleinerung des Bildes um 0.8 oder 80%
bei einer Drehung von 45 Grad.
convert deb6720.png -set option:distort:viewport 190x190-70-70 -virtual-pixel mirror -filter point -distort SRT '.8 45' deb6722.gif

Bei etlichen Größenänderungen werden die Dateigrößen ansteigen. Eine Optimierung
-layers optimize
ist wenig sinnvoll da von Bild zu Bild alle pixel verändert werden. Um eine Datei nicht zu groß werden zu lassen bleibt
die Verringerung der Bildanzahl (hier 20 Bilder)
die Verkleinerung der Farbanzahl (hier 12 Farben)
eventuell eine Verkleinerung der gesamten Bildgröße
Da eine Verkleinerung der Farbanzahl zu einer schlechteren Qualität führt ist es sinnvoll das zentrale Originalbild wieder einzuspielen.
convert deb6720.png -set option:distort:viewport 190x190-70-70 -virtual-pixel mirror -filter point -duplicate 19 -distort SRT '%[fx:1-.5*sin(pi*t/n)] 0' -colors 12 deb6721.png -swap 0 +delete -set delay '%[fx:t==0 ? 200:10]' -loop 0 deb6723.gif

Die Dateigröße liegt bei 253 KB.

Ein Beispiel für eine Drehung mit gleichzeitiger Scalierung:
Es werden die Bilder deb6510.jpg und deb6511.jpg von den vorhergehenden Seiten verwendet.
Da hier ein zweites Bild mit delay 150 eingebaut wird wurde dies über den mpr-Speicher gemacht. Der mpr-Speicher ermöglicht auch elegant das Anfangsbild aufzurufen und alle andereren Bilder mit
-dispose previous
zu versehen.
convert deb6510.jpg \( deb6511.jpg -duplicate 19 -virtual-pixel transparent -filter point -distort SRT '%[fx:exp(-3*t/n)] %[fx:360*t/n]' -reverse \) \( -clone 1--1 -reverse \) -set delay '%[fx:t == 0 ? 150 : 12]' -write mpr:rene -delete 0--1 mpr:rene[20] -set delay '150' -write mpr:mitte +delete mpr:rene[0] -dispose previous mpr:rene[1-19] mpr:mitte mpr:rene[21--1] -layers optimize -loop 0 deb6790.gif


zur Übersicht nächste Seite

Datenschutzerklärung
Impressum