Zusätzlichen Fliesenplatz von einem zusammengesetzten Bild der Montage (ImageMagick) entfernen?

18

Ich habe ein paar Fotos. Sie sind alle gleich groß und ich versuche, sie mithilfe von ImageMagicks Montageprogramm über Bash zu einem zusammengesetzten Bild zusammenzufügen. Das Problem ist, dass die Kachelgröße (ein Bild belegt eine Kachel) standardmäßig dem Bild mit den größten Abmessungen entspricht. Schmale Bilder sind daher von viel Weißraum umgeben. Ich möchte diesen Leerraum entfernen. Wie kann ich es tun?

Gilles 'SO - hör auf böse zu sein'
quelle
Möchten Sie mehrere kleine Bilder in einer Zeile, um den Raum auszufüllen, oder möchten Sie nur transparenten Raum anstelle von Leerraum?
Michael Mrozek

Antworten:

15

Versuchen Sie so etwas:

montage file1.jpg file2.jpg -geometry +0+0 -background none output.jpg

Dadurch wird die Grenze zwischen den Bildern so klein wie möglich und alles, was vorhanden ist, wird transparent.

Um eine Demo des Unterschieds mit integrierten Bildern zu sehen, probieren Sie diese aus und vergleichen Sie:

$ montage rose: -resize 100x60 rose: -geometry +0+0 -background none montage.jpg
$ display montage.jpg &
$ montage rose: -resize 100x60 rose: montage.jpg
$ display montage.jpg &

Siehe Montageverwendung .

Wenn Sie ein Beispiel für das, was Sie erhalten, veröffentlichen und ein Beispiel für das, was Sie möchten, manuell bearbeiten, können wir dem möglicherweise ein wenig näher kommen.

Hier sind Beispiele, die mir besser gefallen als die, die ich ursprünglich oben gepostet habe:

montage \( rose: -resize 100x46\! \) rose: -background gray montage.jpg

Bildbeschreibung hier eingeben

montage \( rose: -resize 100x46\! \) rose: -geometry +0+0 -background none montage.jpg

Bildbeschreibung hier eingeben

Bis auf weiteres angehalten.
quelle
Sie können auch
-mode
14

Ich stimme der akzeptierten Antwort -geometry +0+0zu, zusätzlichen Kachelplatz zu entfernen, und füge -mode Concatenate(unter bestimmten Bedingungen) hinzu.

Auch wenn Sie unterschiedliche Größen haben montage, wird es ein bisschen schwierig, zwischen "Kachelhintergrund" (Kachelraum) und "Rahmen" und "Rand" zu unterscheiden - ich verliere oft den Überblick, daher hier ein kleiner Testfall mit (anklickbare) Bilder:

#$ montage --version # done on:
#Version: ImageMagick 6.6.2-6 2012-08-17 Q16 http://www.imagemagick.org
# pipe to `display` (for preview):
# montage img1.png img3.png img2.png img4.png bmp:- | display

# generate images first
convert -size 200x100 xc:red img1.png
convert -size 300x200 xc:blue img2.png
convert -size 400x300 xc:green img3.png
convert -size 500x400 xc:orange img4.png

# #01: direct montage (-tile 2x2 automatic for four images)
# note: mont01.png is 256x252 pixels!
montage img1.png img3.png img2.png img4.png \
  mont01.png

mont01

# "The 'tile' size is then set to the largest dimentions
# of all the resized images, and the size actually specified."
# "by removing the 'size' component, non of the images will
# be resized, and the 'tile' size will be set to the largest
# dimensions of all the images given"

# #02: specify -geometry offset (tile spacing)
# note: mont02.png is 1008x808 pixels now!
montage img1.png img3.png img2.png img4.png \
  -geometry +2+2 \
  mont02.png

mont02

# #03: add border to command #02:
# border sticks around images themselves
montage img1.png img3.png img2.png img4.png \
  -geometry +2+2 -border 5 \
  mont03.png

mont03

# #04: add frame to command #02:
# frame is around the tile (and is "3D") - and
# background (which isn't image) is colored default gray:
montage img1.png img3.png img2.png img4.png \
  -geometry +2+2 -frame 5 \
  mont04.png

mont04

# #05: add background color spec to command #04:
# that is background behind the tiles - not of the tiles
montage img1.png img3.png img2.png img4.png \
  -geometry +2+2 -frame 5 -background "brown" \
  mont05.png

mont05

# #06: add mattecolor to command #05:
# "-mattecolor The color used as the frame color."
# but just changes color of the "3D" frame borders
montage img1.png img3.png img2.png img4.png \
  -geometry +2+2 -frame 5 -mattecolor "white" -background "brown" \
  mont06.png

mont06

# #07: add bordercolor  to command #05:
# "-bordercolor   The fill color inside the frame for images, or any border padding."
# this does change the color of time background
montage img1.png img3.png img2.png img4.png \
  -geometry +2+2 -frame 5 -bordercolor "purple" -background "brown" \
  mont07.png

mont07

# #08: both frame and border :
# no difference from command #07 -
# once the tiles are resized, the entire remaining
# background is used as a "border", and specifying
# "-border 5" size for it has no effect
montage img1.png img3.png img2.png img4.png \
  -geometry +2+2 -frame 5 -border 5 -bordercolor "purple" \
  mont08.png

mont08

# #09: add mode Concatenate (with -tile) to #08
# No difference from #08
montage img1.png img3.png img2.png img4.png \
  -mode Concatenate -tile 2x2 -geometry +2+2 -frame 5 -border 5 -bordercolor "purple" \
  mont09.png

mont09

# #10 remove -frame, from #09
# now there is no tile background, and
# images are not centered in tiles (they
# have gravity NorthWest instead)
montage img1.png img3.png img2.png img4.png \
  -mode Concatenate -tile 2x2 -geometry +2+2 -border 5 -bordercolor "purple" \
  mont10.png

mont10

# #11 Mode Concatenate with only -tile
# images are without padding (as much as possible)
montage img1.png img3.png img2.png img4.png \
  -mode Concatenate -tile 2x2 -border 5 -bordercolor "purple" \
  mont11.png

mont11

# #12 Try geometry +0+0 instead of concatenate
# almost the same as #11, except more correct overall borders
montage img1.png img3.png img2.png img4.png \
  -tile 2x2 -geometry +0+0 -border 5 -bordercolor "purple" \
  mont12.png

mont12

Nun, ich hoffe, dies kann nützlich sein,
Prost!


BEARBEITEN: Ich habe eine kleine Python / Tkinter / PIL-GUI für ImageMagick, tkGui_ImageMagick.py, zusammengestellt und konnte schließlich die richtige Befehlszeile für etwas finden, das ich wollte: eine Montage von vier Bildern, wobei die Höhe und Breite der Kacheln werden an die größte Breite dieser Spalte (oder Höhe der Zeile) angepasst.

In diesem Beispiel stehen img1 (200x100) und img2 (300x200) in der ersten Spalte. Die größere Breite beträgt 300 - dies sollte die Kachelbreite von img1 festlegen. Außerdem muss die Höhe von img1 mit der größeren Höhe von img3 (300 px) korreliert sein, mit der es eine Zeile bildet. Dies kann über den extentOperator festgelegt werden (siehe auch ImageMagick • Thema anzeigen - Größe ändern und Pad statt Strecken ). Und diese Befehlszeile erfordert Unterprozessaufrufe, um montages für jede Spalte und von dort convertfür jedes Bild zu trennen :

montage \
  <(montage \
    <(convert \
      img1.png -gravity center -extent 300x300  \
      bmp:-) \
    <(convert \
      img2.png -gravity North -extent x400  \
      bmp:-) \
  -tile 1x -geometry +0+0  \
  bmp:-) \
  <(montage \
    <(convert \
      img3.png -gravity center -extent 500x  \
      bmp:-) \
    img4.png \
  -tile 1x -geometry +0+0  \
  bmp:-) \
-geometry +0+0 -border 2 \
mont13.png

# or as one liner:

montage <(montage <(convert img1.png -gravity center -extent 300x300  bmp:-) <(convert img2.png -gravity North -extent x400  bmp:-) -tile 1x -geometry +0+0  bmp:-) <(montage <(convert img3.png -gravity center -extent 500x  bmp:-) img4.png -tile 1x -geometry +0+0  bmp:-) -geometry +0+0 -border 2 mont13.png

mont13

Beachten Sie hier, wenn wir -extentsdirekt in der Montagezeile verwendet hatten, wie folgt:

montage \
    img1.png -extent 300x200 -gravity center \
    img2.png -extent 0x400 -gravity North \
    -tile 1x -geometry +0+0  \
  bmp:-

... wir werden bemerken, dass die erste Angabe für die Höhe (200) ignoriert wird und 400 als größer auf beide Kacheln angewendet wird !

Daher müssen wir das Auffüllen jedes einzelnen Bildes kontrollieren (durch Aufrufen convertvon extentsfür jedes ) - und dann extentsin der montageZeile vermeiden ; und als solches müssen wir a priori die (größte) Breite jeder Spalte (und Höhe jeder Zeile) kennen. Beachten Sie auch:

  • Da img1 kleiner als die implizite Breite / Höhe seiner Nachbarn ist, müssen wir sowohl die Breite als auch die Höhe in ihren Ausmaßen explizit festlegen
  • In der anderen Dimension kann nur die relevante Dimension angegeben werden - und img4 muss als größte überhaupt nicht aufgefüllt (und durchlaufen convert) werden
  • In montage, muss normalerweise nachher-gravity kommen (vollständig spezifiziert: w & h) ; in , arbeitet vorher (normalerweise)-extentconvert-gravity -extent
sdaau
quelle
3

Nicht mit montage, fühlt sich aber genauer an mit:

convert 1.jpg 2.jpg 3.jpg -geometry x500 +append -gravity South a.png

x500 die gewünschte Endhöhe ist

Ben
quelle