2012-09-05 25 views
7

Estoy buscando la manera más eficiente de unir múltiples imágenes juntas en ImageMagick, sobre una imagen de fondo, de manera que el espaciado/relleno entre las imágenes superpuestas sea ¿consistente?Combinación de varias imágenes en ImageMagick con desplazamientos relativos (no absolutos)

He investigado el uso de + append, convert -composite y convertir con -page y -layers merge.

El siguiente comando (convertir -compuesto) funciona, pero requiere un cálculo previo de las dimensiones de la imagen para especificar las compensaciones absolutas. Realmente, quiero un espacio de 10 píxeles entre el final de la PRIMERA imagen en capas y el inicio de la segunda imagen en capas, pero la única manera que puedo ver para lograr eso es especificando el desplazamiento absoluto desde la esquina superior izquierda del lienzo .

convert \ 
    background.jpg \ 
    first.jpg -gravity Northwest -geometry +10+10 -composite \ 
    second.jpg     -geometry +300+10 -composite \ 
    third.jpg     -geometry +590+10 -composite \ 
    output.jpg 

Busco a algún tipo de operador, de modo que la distancia al eje horizontal puede interpretarse en relación con el "último" imagen de la estratificación, por lo que en lugar de especificar +300+10 para la segunda imagen y +590+10 para el tercero, me de alguna manera puede especificar un desplazamiento +10+10.

Pensé que la gravedad me permitiría lograr eso (-gravity Northwest), de la misma manera que float: left; funciona en el posicionamiento CSS, pero ese no es el caso.

I también han tenido cierto éxito con lo siguiente:

convert \ 
    -page +10+10 first.jpg \ 
    -page +300+10 second.jpg \ 
    -page +590+10 third.jpg \ 
    -background transparent \ 
    -layers merge \ 
    layered.png 

convert background.jpg layered.png -gravity Center -composite output.jpg 

Tanto las técnicas descritas requieren pre-cálculo de las compensaciones absolutos, que es un poco de dolor. ¿Hay una mejor manera de hacer esto?

+0

¿Todas las imágenes de entrada para el mismo proceso de costura tienen el mismo ancho y alto (y solo pueden cambiar para la siguiente costura)? –

+0

El fondo es una imagen real, pero sus dimensiones serán estáticas (o al menos será una especie de imagen fácilmente incrustada/cultivable). –

+0

Las imágenes no tienen todas las mismas dimensiones. Los limitaremos a una altura máxima y un ancho máximo (por determinar), por lo que dependiendo de las dimensiones de la imagen de entrada, esta restricción dará como resultado anchos variables. –

Respuesta

7

Ha pasado por alto el comando montage.

El comando más simple para agregar el espaciado deseado sería establecer una opción -frame 5 con -mattecolor none. Esto funciona con imágenes de diferentes valores de anchura y espacios todos ellos separados con una distancia de 10 píxeles:

montage    \ 
    -alpha on   \ 
    -background none \ 
    -mode concatenate \ 
    -tile x1   \ 
    -frame 5   \ 
    -mattecolor none \ 
    *.jpg   \ 
    output1.png 

Usted fácilmente notará sin embargo, que la frontera de la imagen resultante es de sólo 5 píxeles de ancho en la parte superior, derecho, inferior E izquierda. Para eliminar estos 5 píxeles en todo uso:

convert output1.png -shave 5 output2.png 

para superponer este resultado en su background.jpg, utilice:

convert    \ 
    background.jpg \ 
    output2.png  \ 
-gravity Northwest \ 
-geometry +10+10 \ 
-composite   \ 
    final.jpg 
2

También puede utilizar truco marco transparente de Kurt con append. Usar append en lugar de montaje tiene la ventaja de que puede usar la configuración de gravedad para alinear las imágenes en la parte superior (norte), inferior (sur) o centro.

Aquí hay un ejemplo de cómo agregar imágenes horizontalmente con una separación de 10 píxeles entre ellos, y con las imágenes alineación superior:

convert \ 
    -frame 5 \ 
    -mattecolor none \ 
    -background none \ 
    -gravity north \ 
    first.jpg second.jpg third.jpg \ 
    +append \ 
    png:- | convert - -shave 5 
    output.png 

para anexar imágenes usan verticalmente en lugar de -append + anexión. He usado una pipa | para afeitar el marco exterior en el mismo comando.

Cuestiones relacionadas