¿Cómo cambio el tamaño del lienzo de un PNG con ImageMagick (GraphicsMagick)? (¿Cómo rellenar con transparencia?)

9

Alternativamente: ¿Cómo tomo un PNG no cuadrado y "relleno" el "resto" de la imagen con transparencia para que la imagen cuadrada resultante tenga la imagen original centrada en el cuadrado?

ULTIMADAMENTE, lo que quiero es tomar cualquier imagen de cualquier formato compatible con GM de cualquier tamaño, y crear un PNG reducido (por ejemplo, 40 píxeles como máximo para cualquier dimensión), con una relación de aspecto mantenida, con relleno de transparencia para no cuadrado imágenes originales, Y con una máscara de transparencia PNG ya preparada de 40x40 aplicada.

Ya sé cómo reducir y mantener la relación de aspecto; Ya tengo el comando para aplicar mi compuesto. Mi única pieza que falta es la alineación de imágenes no cuadradas (relleno con transparencia).

Comando único preferido; cadena de comandos múltiples aceptable.

(editar)

Información adicional: Aquí está el comando compuesto que estoy usando:

gm composite -compose copyopacity mask.png source-and-target.png source-and-target.png

donde mask.png tiene píxeles blancos para lo que quiero conservar de source-and-target.png y píxeles transparentes para lo que quiero eliminar (y volverme transparente) de source-and-target.png.

Pistos
fuente

Respuestas:

7

Este comando tomará un archivo de entrada de cualquier tamaño y lo ajustará mejor a un cuadrado de 40x40 y relleno con transparencia:

convert \
   original.png \
  -thumbnail '40x40>' \
  -background transparent \
  -gravity center \
  -extent 40x40 \
  -compose Copy_Opacity \
  -composite mask.png \
   original-resized.png

La gravityopción garantiza que la imagen esté centrada en ambas direcciones y transparentse use donde no haya píxeles. Luego la composición se realiza con elmask.png

Pablo
fuente
¿Entonces no podemos hacerlo de una vez composite?
Pistos
@Pistos No tengo claro qué está haciendo con el compuesto: ¿es solo una máscara de transparencia para ocultar / mostrar partes de la miniatura después de cambiar el tamaño? ¿Puedes editar y agregar la secuencia de comandos que tienes hasta ahora, para que podamos ver si se puede combinar?
Paul
@Pistos Creo que el mejor enfoque es hacer la composición con -convertir y no al revés. He actualizado mi respuesta anterior.
Paul
Cerca, pero no del todo. Su comando no funcionó tal cual, e incluso con ajustes, no funcionó. Está bien, lo haré en dos pasos. Actualizaré las cosas aquí después de obtener los pasos finales de la CLI que funcionan. Gracias de nuevo.
Pistos
Agregaría -filter Catromantes de la thumbnailopción porque, según mi experiencia, generalmente produce imágenes de mayor calidad.
thdoan
6

Un comando para convertir todos los PNG de una carpeta:

mogrify \
 -resize 50x50 \
 -background transparent \
 -gravity center \
 -extent 50x50 \
 -format png \
 -path resized \
 *.png

mogrify es un comando del paquete ImageMagick. Primero debe crear el directorio de salida.

uı6ʎɹnɯ ꞁəıuɐp
fuente
Buena esa. Por cierto, si te sientes aventurero, puedes omitir -path resizededitar los archivos en su lugar.
aaronk6
Esto es genial. En mi instalación (OSX, 1.3.35) es gm mogrifyy en lugar de -path resizedusar-create-directories -output-directory resized
Blake
1

Esto es con lo que finalmente fui. Un proceso de dos pasos:

gm convert \
  -thumbnail '40x40>' \
  -background transparent \
  -gravity center \
  -extent 40x40 \
   original.png \
   intermediate.png

gm composite \
  -compose in \
   intermediate.png \
   mask.png \
   out.png

Donde mask.png es píxeles blancos para lo que quería mantener, y píxeles transparentes para lo que quería enmascarar (descartar).

Pistos
fuente