eliminar espacio de mosaico adicional de una imagen compuesta de montaje (ImageMagick)?

18

Tengo un montón de fotos. Todos tienen la misma altura, y estoy tratando de juntarlos en una imagen compuesta usando el programa de montaje de ImageMagick a través de Bash. El problema es que, por defecto, el tamaño del mosaico (una imagen ocupa un mosaico) es igual a la imagen con las dimensiones más grandes. Las imágenes estrechas, por lo tanto, están rodeadas de mucho espacio en blanco. Quiero eliminar este espacio en blanco. ¿Cómo puedo hacerlo?

Gilles 'SO- deja de ser malvado'
fuente
¿Desea múltiples imágenes pequeñas en una línea para llenar el espacio, o simplemente desea un espacio transparente en lugar de un espacio en blanco?
Michael Mrozek

Respuestas:

15

Intenta algo como esto:

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

Esto hará que el borde entre las imágenes sea lo más pequeño posible y lo que sea que haya allí será transparente.

Para ver una demostración de la diferencia usando imágenes integradas, pruebe estas y compare:

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

Ver uso de montaje .

Si publica un ejemplo de lo que está obteniendo y edita manualmente un ejemplo de lo que le gustaría como resultado, es posible que podamos acercarnos un poco más a eso.

Aquí hay ejemplos que me gustan más que los que originalmente publiqué anteriormente:

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

Pausado hasta nuevo aviso.
fuente
También puedes usar -mode concatenate
Zloy Smiertniy
14

Estoy de acuerdo con la respuesta aceptada de -geometry +0+0eliminar espacio de mosaico adicional, y agregaría -mode Concatenate(bajo ciertas condiciones).

Además, una vez que tenga diferentes tamaños montage, se hace un poco difícil discernir entre lo que es "fondo de mosaico" (espacio de mosaico) frente a "marco" y "borde". imágenes (seleccionables):

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

Bueno, espero que esto pueda ser útil,
¡salud!


EDITAR: armé una pequeña GUI de Python / Tkinter / PIL para ImageMagick, tkGui_ImageMagick.py , y finalmente pude encontrar la línea de comando adecuada para algo que quería: hacer un montaje de cuatro imágenes, donde la altura y el ancho de los mosaicos coinciden con el ancho más grande de esa columna (o la altura de la fila).

En este ejemplo, img1 (200x100) e img2 (300x200) van en la primera columna, el ancho más grande es 300, lo que debería establecer el ancho del mosaico de img1. Además, img1 necesita tener su altura correlacionada con la altura más grande de img3 (300 px), con la que forma una fila. Esto se puede especificar a través del extentoperador (consulte también ImageMagick • Ver tema: cambiar el tamaño y rellenar en lugar de estirar ). Y esa línea de comando requiere llamadas de subproceso para separar montages para cada columna, y desde allí, converts separados para cada imagen:

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

Tenga en cuenta aquí, si hubiéramos usado -extentsdirectamente en la línea de montaje, así:

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

... notaremos que la primera especificación para la altura (200) será ignorada, ¡y 400 de mayor tamaño se aplicará a ambas fichas de todos modos !

Por lo tanto tenemos que controlar el relleno de cada imagen individual (llamando convertcon extentspara cada uno ) - y luego evitar extentsen la montagelínea; y como tal, debemos saber a priori el ancho (más grande) de cada columna (y la altura de cada fila). Tenga en cuenta también:

  • Dado que img1 es más pequeño que el ancho / alto implícito de sus vecinos, debemos establecer explícitamente tanto el ancho como el alto en sus extensiones
  • La otra dimensión solo puede tener la dimensión relevante especificada, e img4, como la más grande, no tiene que rellenarse (ni ejecutarse convert)
  • En montage, generalmente -gravitytiene que venir después (completamente especificado: w & h) -extent; en convert, -gravityfunciona antes -extent (generalmente)
sdaau
fuente
3

No con montage, pero se siente más preciso con lo siguiente:

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

x500 siendo la altura final deseada

Ben
fuente