Kombinieren Sie mehrere Bilder mit ImageMagick


166

Ich möchte mit ImageMagick mehrere Bilder zu einem Bild kombinieren. Um es etwas besser zu erklären, möchte ich, dass das Ergebnis so aussieht:

Das heißt, ich habe eine Reihe von Screenshots, und ich möchte sie in ein Bild mit den Originalbildern übereinander verwandeln.

Beim Googeln bin ich auf den Befehl 'composite' gestoßen, aber ich weiß nicht, ob und wie ich ihn verwenden soll, um das gewünschte Ergebnis zu erzielen.



Antworten:


256

Für eine beliebige Anzahl von Eingabedateien mit dem Namen :in-<something>.jpg

convert -append in-*.jpg out.jpg

Um bestimmte Dateien anhängen zu lassen oder Zahlen zu überspringen, anstatt den vollständigen "Glob" zu erhalten, können Sie die Eingabedateien explizit erwähnen und den appendBefehl danach einfügen

konvertiere in-1.jpg in-5.jpg in N .jpg + füge out-in1-plus-in5-and-in N .jpg hinzu

Sie können -append(anstelle von +append) für vertikales Einfügen verwenden.

Oder:

montage -mode concatenate -tile 1x in-*.jpg out.jpg

erstellt auch eine Datei out.jpg, die eine vertikale Verkettung der Quellbilder enthält.

convert

Für die einfache Verkettung in einer einzelnen Zeile oder Spalte ist die appendOption des convertTools ausreichend. Beachten Sie, dass -appendalle Bilder vertikal verkettet werden, wobei eine Spalte mit n Zeilen erstellt wird, und +appendhorizontal verkettet wird, wobei eine Zeile mit n Spalten erstellt wird.

(Siehe ImageMagick: Befehlszeilenoptionen .)

montage

Um eine genauere Kontrolle über das Layout zu erhalten, benötigen wir das montageTool. montage -mode concatenateklebt die eingegebenen Bilder wie bei der appendOption zusammen und -tile 1xsteuert das anzuwendende Layout.

tilefolgt dem Format Spalten × Zeilen , aber jede Seite kann fehlen und montagewird herausfinden, wie die Einschränkungen zu erfüllen sind.

Wir verwenden hier 1x(genau eine Spalte mit einer beliebigen Anzahl von Zeilen), um den gleichen Effekt wie zu erzielen -append. Ohne -tile 1xwürde es die Bilder wie +appendstandardmäßig verbinden -tile x1(beliebig viele Spalten in einer Zeile).

(Siehe ImageMagick-Beispiele: Montage, Arrays von Bildern .)


1
Vielen Dank. Das Anhängen funktioniert einwandfrei, aber die Montage ist meines Erachtens fehlerhaft: Wenn keine Ghostscript-Schriftarten installiert sind, kommt es zu einer Rettung, AUCH wenn Sie die Bilder nicht mit Anmerkungen versehen. Schriften sollten auf Anfrage und nicht im Voraus geladen werden.
Bram

@Bram: Das wusste ich nicht und stimme voll zu. Wissen Sie, ob sich GraphicsMagick gleich verhält?
Donnerstag,

2
@ MikeRobinson convert -append `counter=0; for x in in-*; do if [[ $(($counter % 2)) == 0 ]]; then echo $x; fi; counter=$((counter + 1)); done` out.jpgsollte den Job machen.
gozzilli

2
Beachten Sie, dass der convert -tile 2x2Befehl etc. die Dateien alphabetisch liest . Dies bedeutet, dass die genannten Chunks 0-10wie folgt gelesen werden 0,10,1,2,..,9. Ich brauchte fast 2 Stunden, um etwas so grundlegendes zu realisieren.
Phil294

1
@Blauhirn: Sortiert die Konvertierung die Dateinamen oder ist das nur Ihr Glob, der die Dateien in dieser Reihenfolge zurückgibt? ZB ls *werden diese Werte in dieser Reihenfolge zurückgegeben.
naught101
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.