ImageMagick nützliche Beispiele

Aus Linupedia.org
Version vom 10. August 2007, 21:41 Uhr von TomcatMJ (Diskussion | Beiträge) (Kategorie und Navigation mit noinclude hinzugefügt zwecks Einbindbarkeitserhaltung für andere Artikel)
Wechseln zu: Navigation, Suche
Hinweis:

Bitte vor Änderungen an diesem Artikel die Hinweise auf den Diskussionsseite lesen .


Befehlsbeispiele mit convert

einfaches Formatumwandlung und Scalierung

Ein Ursprungsbild im Format JPEG soll umgewandelt und gespeichert werden als PNG.
Das Ursprungsbild (hier bild.jpg) soll dabei erhalten bleiben. Der entstehende Bildtype wird durch die Endung des Ausgangsbildes (hier .png) vorgegeben.

convert bild.jpg bild.png 

Zusätzlich zu der Formatumwandlung möchten wir aber auch die Größe des Ausgangsbildes ändern. Wir möchten dabei das Seitenverhältniss des Orginalbildes jedoch beibehalten aber die Höhe und Breite auf jeweils 640 Pixel begrenzen. Hochkanntbilder haben dann 640 Pixel Höhe und normale Bilder haben 640 Pixel Breite, immer bei Beibehaltung der Seitenverhältnisse des Orginalbildes

convert bild.jpg -resize 640x640 bild.png

Um ein Bild unabhängig der Seitenverhältnisse auf eine ganz bestimmte Pixelgröße zu zwingen, benutzt man ein Ausrufezeichen hinter der Größenangabe.

convert bild.jpg -resize 300x280! bild.png

Es ist auch möglich das Bild prozentuel zu vergößern oder zu verkleinern.

convert bild.jpg -resize 50% bild.png


Bilder beschneiden

Um nun nur einen Teil eines Bildes zu verarbeien kann man diesen aus dem Gesamtbild ausschneiden mit der Option -crop

convert logo: -crop 200x200+310+100 +repage x:

Dieser Befehl hat gleich einige Besonderheiten auf die wir eingehen wollen.

  • Das Eingangsbild hier ist logo: Dieses ist das ImageMagick-Logo das in die Sortware eingebaut ist und das kann man hervorragend zum Testen benutzen.
  • Das Ausgangsbild ist x: Hierbei handelt es sich um eine spezielle Ausgabe, und zwar wird das Bild gleich auf der X-Oberfläche angezeigt. Es hat die selbe Auswirkung wie das Beispiel unter display nur hier viel kürzer zu schreiben und mit einem abgespecktem Display-Programm. Wenn der Befehl das gewünschte Ergebnis erbringt, braucht man es nur gegen einen Bilderdateinamen auszutauschen. Man kann also auf diese Art und Weise sehr einfach anschauen, was ein Befehl für ein Bild erzeugen würde, bevor man in irgendwelche Dateien schreibt.
  • die Option hinter -crop gibt an, was aus dem Bild ausgeschnitten werden soll und zwar
200x200+310+100 bedeutet 200x200 Bildpunkte ab der Position 310 Bildpunkte nach rechts und 100 Bildpunkte nach unten.
  • +repage mit dieser Option entfernen wir beim beschneiden mit -crop aus dem Header des Bildes die "canvas und offset" Werte, die würden sonst beim Beschneiden falsch stehen bleiben.




convert logo:  -gravity Center -crop 75%x+0+0  +repage x:

hier wird ebenfalls -crop verwendet. Wir schneiden vom Bild 75% aus, und zwar wurde mit der Option -gravity und dem Versatz von +0+0 die Mitte des Bildes bestimmt. Dieser Befehl schneidet also an den Rändern des Bildes 25% ab, egal wie groß das Bild ist. So etwas würde sich zB anbieten als erste Bearbeitungsstufe für die Erstellung von vergrößerten Vorschaubildern uä.




manchmal ist es erforderlich, das man sehr große Bilder in Einzelbilder aufteilt. hier ein Beispiel wie man ein Bild in 4 Teilbilder zerlegt und dann wieder zusammenbaut.

# convert logo: -depth 16 testa.png                          #TestBild testa.png erzeugen
# convert testa.png -crop 50% test_%d.png                    #Aufteilen des Bildes in 4 Teile
# montage -mode concatenate -tile 2x2 test_?.png testf.png   #Zusammenbau der 4 Teile zu einem Bild testf.png
#
# identify test*.png                                         #Bildinformationen der 6 Bilder anzeigen lassen
test_0.png PNG 320x240 640x480+0+0 DirectClass 16-bit 37.0449kb 
test_1.png[1] PNG 320x240 640x480+320+0 DirectClass 16-bit 48.9062kb 
test_2.png[2] PNG 320x240 640x480+0+240 DirectClass 16-bit 5.42773kb 
test_3.png[3] PNG 320x240 640x480+320+240 DirectClass 16-bit 45.5645kb 
testa.png[4] PNG 640x480 640x480+0+0 DirectClass 16-bit 141.48kb 
testf.png[5] PNG 640x480 640x480+0+0 DirectClass 16-bit 141.459kb 
# compare testf.png testa.png x:                             #nach Differenzen zwischen testf.png und testa.png suchen
  • die Option -depth 16 : damit legen wir die Farbtiefe genau fest.
  • -crop 50% in dieser Kombination mit der Angabe der multiblen Ausgabedatei(en) erzeugt genau 4 Teilbilder vom Gesamtbild
  • mit montage bauen wir die Bilder wieder zusammen Option concatenate -tile 2x2 bedeutet ohne Zwischenraum mit einer Geometrie 2x2 Bilder.
  • Zur Information: mit identify lassen wir uns die Bildeigenschaften aller Bilder anzeigen
  • Zur Kontrolle: compare führt hier einen mathematischen Vergleich von Endbild und Ausgangsbild durch und zeigt ihn uns grafisch an. (rote Bildpunkte sind Veränderungen zwischen beiden Bildern)



Bilder spiegeln und drehen

Es gibt in ImageMagick 4 einfache Möglichkeiten Bilder zu spiegelen

  • waagerecht -flip
  • senkrecht -flop
  • diagonal (linksoben-rechtsunten) -transpose
  • diagonal (rechtsoben-linksunten) -transverse

Beispiele mit dem Logo und Ausgabe anstatt in eine Datei gleich Anzeige mit display:

convert logo: -flip x:
convert logo: -flop x:
convert logo: -transpose x:
convert logo: -transverse x:


Bilder drehen kann man mit dem Operator -rotate x (wobei x die Drehung in Grad bestimmt)
Beispiele mit dem Logo und Ausgabe anstatt in eine Datei gleich Anzeige mit display

convert logo: -rotate 90 x:
convert logo: -rotate -90 x:
convert logo: -rotate -130 x:

Zu beachten ist, bei Drehungenswinkeln die nicht durch 90 teilbar sind, wird die Bildgröße verändert, warum zeigt das nächste Beispiel.

convert logo: -background blue -rotate 45 x:


Beim Drehen gibt es noch eine nette Erweiterung, wir können an Hand des Seitenverhältnisses bestimmen, ob das Bild gedeht werden soll oder nicht. Diese Option kann man gelegentlich bei der automatischen Bildbearbeitung in Scripten sehr gut gebrauchen.

  • ein < direkt hinter der Winkelangabe bedeutet, das Bild wird nur gedeht wenn es höher als breit ist
  • ein > direkt hinter der Winkelangabe bedeutet, das Bild wird nur gedeht wenn es breiter als hoch ist.

( da es sich hierbei um Sonderzeichen handelt die die Shell anders interpretieren würde, müssen wir diese vor der Interpretation in der Shell schützen )

convert logo: -resize 200x150! -rotate "90<" x:
convert logo: -resize 150x200! -rotate "90<" x:
convert logo: -resize 150x200! -rotate 90\< x:
convert logo: -resize 200x150! -rotate 90\< x:

Befehlsbeispiele mit mogrify

Befehlsbeispiele mit montage

Tricks und Tips für spezielle Aufgaben

automatische Bildorientierung mit ImageMagick

Wenn wir wild umeinander fotografieren machen wir nicht nur breitformatige Bilder sondern gelegentlich auch hochformatige Bilder (Porträtformat). Einge teure Kameras registrieren das auch, oder Bildbearbeitungssoftware trägt das so bei Bearbeitung der Bilder in den Bildheader ein. Wenn wir uns jetzt die so entstandenen Bilder zB im Konqueror ansehen, dann korrigiert der Konqueror die Ausrichtung der Bilder automatisch, auch die Bildervorschau und thumbnails im Konqueror ist richtig. Andere Bildanzeigeprogramme zB xv oder auch GIMP zeigen die Bilder aber nach wie vor im Breitformat. Zuständig für diese Automatik der automatischen Ausrichtung in einigen Programmen ist die EXIF:Orientation diese können wir in den Bildern abfragen mit

# identify -format '%[exif:orientation]' bildname.jpg

wird hier eine 1 (TopLeft) zurückgeliefert, dann ist dort eingetragen: das Bild ist richtig ausgerichtet. In den neueren Versionen (ca. ab IM 6.2.8) kann man mit ImageMagick auch mit diesen Optionen arbeiten. Am Besten ihr testet mal ob eure Version das unterstützt.

# convert -list Orientation

bringt entweder einen Fehler, das es nicht unterstützt wird, oder folgende Ausgabe

TopLeft
TopRight
BottomRight
BottomLeft
LeftTop
RightTop
RightBottom
LeftBottom

Ihr könnt den Eintrag der Orientation eurer Bilder ändern ohne die Bilder dabei selbst zu drehen.

# mogrify -orient RightTop bildname.jpg       #für Bilder bei denen oben am linken Rand ist
# mogrify -orient LeftBottom bildname.jpg     #für Bilder bei denen oben am rechten Rand ist
# mogrify -orient TopLeft bildname.jpg        #für richtig gedrehte Bilder die aber jetzt falsch angezeigt werden

das alles unter der Bemerkung des Beispiels ,das die Bildqualität damit zumindestens nicht besser wird. (Achtung: im Beispiel ist der Befehl mogrify verwendet.] Wenn ihr sowas wirklich Qualitätsverlustfrei machen wollt, ist JHead als Programm besser geeignet. Zum Anzeigen und Verarbeiten der Bilder entsprechend der richtigen Orientation gibt es in ImageMagick die Option -auto-orient

# display -resize 800x800 -auto-orient bild.jpg 

zeigt ein Bild entsprechend der EXIF Orientation richtig an, convert und die anderen Befehle zur Bildbearbeitung nutzen analog die selbe Option.

Weiterführende Informationen zu diesem Thema gibts hier



Musterbilder erstellen

Hin und wieder braucht jemand von seinen Fotos für irgendwelche Zwecke Musterbilder. Diese Bilder sollen für andere zwar ansehbar und auch in einer geminderten Qualität aber nicht weiterverwendbar sein. Hier reicht es nicht aus, die Bilder am Rand zu beschriften oder irgendwo in die Ecke ein kleines Logo zu setzen. Es soll am besten ein riesen Logo quer über das Bild, damit man es nicht wegschneiden kann. Folgendes Script kann das erledigen.

#/bin/bash
# Das Script sucht im aktuellem Verzeichnis nach ".jpg"-endenden Dateien und nimmt an es handelt sich um Bilder
# von den Bildern werden Kopien definierter Groesse gemacht und mit Text-Wasserzeichen versehen
# den so enstehenden Kopien wird die Vorsilbe "muster_" vor den Dateinamen gegeben.
# erforderlich ist das Paket ImageMagick (Version 6)

FONT="/usr/X11/lib/X11/fonts/truetype/VeraBd.ttf" # Die Schriftart die Verwendung finden soll
FONTSIZE=120                                      # Die Schriftgroesse in Pixel (Werte 32 bis 120)
COPYRIGHT="* Muster *"                            # der Wasserzeichentext
SIZE="800x800"                                    # die Bildergroesse die entstehen soll
POS=Center                                        # Position des Wasserzeichens (Mitte=Center Unten=South Oben=North)
KOMPR=98                                          # jpeg Kompressionsfaktor [ 85 (normal) bis 98 (sehr gut)] 

# Infos zu den einzelnen Befehlen und weiteren Moeglichkeiten unter http://www.imagemagick.org/Usage

convert -font $FONT -pointsize $FONTSIZE -background black -fill white \
 label:"$COPYRIGHT" -trim +repage -bordercolor black -border 20x10 tmp_mask1.png

convert tmp_mask1.png -blur 0x03 -shade 135x45 -normalize tmp_shade135.png

convert tmp_mask1.png -font $FONT -pointsize $FONTSIZE -fill white -gravity center \
   -stroke white -strokewidth 3 -draw "text 0,0 \"$COPYRIGHT\"" tmp_mask2.png 

convert tmp_shade135.png tmp_mask2.png +matte -compose CopyOpacity -composite mask3d.png
rm tmp_mask1.png tmp_mask2.png tmp_shade135.png

for BILD in *.jpg
do
 composite mask3d.png "${BILD}" -resize $SIZE -gravity $POS -compose HardLight -quality $KOMPR muster_"$BILD"
done
rm mask3d.png


Der erste Teil des Scriptes ist dokumentiert. Hier werden die persönlichen Einstellungen gemacht. Aufgerufen wird das Script in dem Verzeichnis in dem die JPEG-Dateien liegen, von denen man die Muster braucht und zwar ohne irgend eine Option.

Musterbild erstellt mit Script
  • der erste convert Befehl erstellt eine Bildmaske aus dem Schriftzug Dateiname tmp_mask1.png
  • der zweite convert Befehl macht durch weichzeichnen Schatten und normalisieren daraus ein graues 3D-Schatten Bild Namens tmp_shade135.png
  • der dritte convert nimmt die erste Maske als Vorlage und schreibt die selbe Schrift nocheinmal aber etwas verbreitert darauf tmp_mask2.png
  • der vierte convert nimmt jetzt die 2 Maske und schneidet mit ihrer Hilfe das 3D Schattenbild aus, indem es den Rest unsichtbar macht.mask3d.png
  • die beiden Masken und das Schattenbild werden gelöscht, die brauchen wir nicht mehr.
  • in einer Schleife werden jetzt alle JPEG-Bilder einzeln mit mask3d.png überlagert und dabei ein verkleinertes Bild Namens muster_ALTERDATEINAME erstellt.
  • nach Abschluss der Schleife wird auch mask3d.png gelöscht.


Achtung: es ist nicht ganz sicher seit welcher Version von ImageMagick dieses Script funktioniert es wurde getestet SuSE 10.1 und neuer.


Farb und Kontrastverbesserung bei Unterwasserbildern

Obwohl diese Methode hier auch auf normale Bilder anwendbar ist, stellen wir sie unter der Überschrift Unterwasserbilder, da hier der Effekt sehr ausgeprägt auftritt.
Unterwasserbilder zB. mit einer UW-Digitalkamera gemacht, sehen im Display der Kamera ja noch recht ansehlich aus. Sobald man sie aber über den Computer ansieht, erkennt man das ganze Übel. Jetzt kommen nicht nur Unschärfe und Bewegungsunschäfe und das Plankton im Blitzlicht so richtig zu Geltung, nein je größer wir uns das Bild anschauen, je mehr fällt auf, dass auf sehr vielen Bildern die Farben in Richtung hellblau, hellgrün oder helllila verwaschen aussehen, der Farbkontrast fehlt und überhaupt alles trübe aussieht. Es ist überhaupt kein Vergleich mit dem was man gesehen hat und fotografieren wollte. Die Kamera ist hier oftmals unschuldig, es ist vielmehr das Auge und Hirn das viel diffenzierter und genauer für jeden Augenblick neu Weißabgleich und Farbkorrekturen vornimmt, und uns so Farben und Kontraste vorgaugelt, die keine Kamera der Welt derzeit genauso reproduzieren kann. Bei vielen dieser Fotos kann man das mit einer digitalen Farbkorrektur jedoch einigermaßen hinbiegen, und so doch noch sehr schöne Fotos zusammenzaubern die in etwa dem entsprechen was das Auge gesehen hat. Früher habe ich das mit Gimp gemacht, das war jedoch sehr mühsam. Seit IM v6.2.6 ist die richtige Option dafür auch in ImageMagick enthalten.

convert img_0.jpg -channel 'RGBA' -contrast-stretch 1% -quality 98 korrektur_0.jpg

Mittels convert wird vom Bild img_0.jpg mittels contrast-stretch eine Farbspreizung über RGB und den Alpha-Kanal vorgenommen. Das Ergebniss wird mit niedriger Komprimierung in korrektur_0.jpg abgelegt. Nicht alle Bilder lassen sich so direkt bearbeiten. Sind im Ausgangsbild sehr wenig unterschiedliche Farbbereiche vorhanden, dann wird diese Methode zu extrem. Es entstehen oftmals unnatürliche poppige Farben. Hier kann man folgendes versuchen, in dem mittels montage ein weiteres Bild mit breitem Farbbereich an das Bild angehängt wird und das so entstandene Doppelbild über contrast-stretch laufen läßt. Anschließend werden die Bilder wieder voneinander getrennt. Nach einigen Versuchen mit verschiedenen Bildern hat man oftmals dann doch noch ein einigermaßen brauchbares Bild.
links Orginalbild rechts nach Bearbeitung mit contrast-stretch


Zurück zur Grafikübersicht