supprimer l'espace de tuile supplémentaire d'une image composite de montage (ImageMagick)?

18

J'ai un tas de photos. Ils sont tous de la même hauteur, et j'essaie de les assembler dans une image composite en utilisant le programme de montage d'ImageMagick via Bash. Le problème est que par défaut, la taille de la tuile (une image occupe une tuile) est égale à l'image avec les plus grandes dimensions. Les images étroites sont donc entourées de beaucoup d'espace blanc. Je veux supprimer cet espace blanc. Comment puis-je le faire?

Gilles 'SO- arrête d'être méchant'
la source
Voulez-vous plusieurs petites images sur une ligne pour remplir l'espace, ou voulez-vous simplement un espace transparent au lieu d'un espace blanc?
Michael Mrozek

Réponses:

15

Essayez quelque chose comme ceci:

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

Cela rendra la frontière entre les images aussi petite que possible et tout ce qui s'y trouvera sera transparent.

Pour voir une démonstration de la différence à l'aide d'images intégrées, essayez-les et comparez:

$ 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 &

Voir Utilisation du montage .

Si vous publiez un exemple de ce que vous obtenez et modifiez manuellement ensemble un exemple de ce que vous souhaitez en conséquence, nous pourrons peut-être nous rapprocher un peu de cela.

Voici des exemples que j'aime mieux que ceux que j'ai initialement publiés ci-dessus:

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

entrez la description de l'image ici

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

entrez la description de l'image ici

En pause jusqu'à nouvel ordre.
la source
Vous pouvez également utiliser -mode concatenate
Zloy Smiertniy
14

Je serais d'accord avec la réponse acceptée de -geometry +0+0supprimer l'espace de tuile supplémentaire, et j'ajouterais -mode Concatenate(sous certaines conditions).

De plus, une fois que vous avez des tailles différentes montage, il devient un peu difficile de discerner ce qui est "fond de tuile" (espace de tuile) vs "cadre" et "bordure" - je perds souvent la trace moi-même, voici donc un petit test avec images (cliquables):

#$ 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

Eh bien, j'espère que cela pourra vous être utile,
Cheers!


EDIT: J'ai mis en place une petite interface graphique Python / Tkinter / PIL pour ImageMagick, tkGui_ImageMagick.py - et enfin j'ai pu trouver la ligne de commande appropriée pour quelque chose que je voulais: faire un montage de quatre images, où la hauteur et la largeur des tuiles correspondent à la plus grande largeur de cette colonne (ou hauteur de ligne).

Dans cet exemple, img1 (200x100) et img2 (300x200) vont dans la première colonne, la plus grande largeur est 300 - ce qui devrait définir la largeur de tuile de img1. En outre, img1 doit avoir sa hauteur corrélée à la plus grande hauteur d'img3 (300 px), avec laquelle il forme une ligne. Cela peut être spécifié via l' extentopérateur (voir aussi ImageMagick • Voir le sujet - Redimensionner et remplir au lieu d'étirer ). Et cette ligne de commande nécessite des appels de sous-processus pour séparer les montages pour chaque colonne - et à partir de là, les converts séparés pour chaque image:

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

Notez ici, si nous l'avions utilisé -extentsdirectement dans la ligne de montage, comme ceci:

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

... on remarquera que la première spécification de hauteur (200) sera ignorée, et 400 comme le plus grand sera appliqué aux deux tuiles de toute façon !

Ainsi, nous devons contrôler le remplissage de chaque image individuelle (en appelant convertavec extentspour chacun ) - puis éviter extentsdans la montageligne; et en tant que tel, nous devons a priori connaître la largeur (la plus grande) de chaque colonne (et la hauteur de chaque ligne). A noter également:

  • Étant donné que img1 est plus petit que la largeur / hauteur implicite de ses voisins, nous devons explicitement définir à la fois la largeur et la hauteur dans ses étendues
  • L'autre dimension ne peut avoir que la dimension appropriée spécifiée - et img4, comme la plus grande, n'a pas du tout besoin d'être complétée (et parcourue convert)
  • Dans montage, -gravitydoit généralement venir après (entièrement spécifié: w & h) -extent; à convert, -gravitytravaille avant -extent (généralement)
sdaau
la source
3

Pas avec montage, mais se sent plus précis avec les éléments suivants:

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

x500 étant la hauteur finale souhaitée

Ben
la source