Miniaturas cuadradas con ImageMagick (convertir)?

Respuestas:

19

Esto se explica en la documentación oficial de ImageMagick en "Cortar la miniatura para ajustar" :

Una alternativa, en lugar de rellenar la imagen para que se ajuste al tamaño de miniatura específico que queremos, es cortar las partes de la imagen que no se ajustan al tamaño final.

Por supuesto, esto significa que realmente pierde algunas partes de la imagen original, particularmente los bordes de la imagen, pero el resultado es una miniatura ampliada de la parte central de la imagen. Este es generalmente (pero no siempre) el tema principal de la imagen, por lo que es un método práctico de creación de miniaturas.

A partir de IM v6.3.8-3, se agregó el indicador de opción de cambio de tamaño especial '^' para facilitar esto. Simplemente cambiamos el tamaño usando esta bandera y luego recortamos las partes de la imagen que desbordan el tamaño deseado.

Y en el contexto de un comando de ejemplo:

convert -define jpeg:size=200x200 hatching_orig.jpg  -thumbnail 100x100^ \
          -gravity center -extent 100x100  cut_to_fit.gif
Ignacio Vazquez-Abrams
fuente
77
Posiblemente ... algún tipo de descripción?
Hola71
Me encantan las respuestas en blanco de Ignacio :-)
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
55

Ignacio se vinculó a la documentación correcta, sin embargo, la pegaré en línea aquí por conveniencia:

convert -define jpeg:size=200x200 original.jpeg  -thumbnail 100x100^ -gravity center -extent 100x100  thumbnail.jpeg

Del mismo modo, lo siguiente es para GraphicsMagick:

gm convert -size 200x200 original.jpeg -thumbnail 100x100^ -gravity center -extent 100x100 +profile "*" thumbnail.jpeg

Explicación:

  • -size 200x200 le dice al decodificador jpeg que solo necesitamos esta resolución para que pueda ahorrar memoria y leer la imagen fuente más rápido
  • -thumbnail 100x100^ cambio de tamaño rápido haciendo el lado más corto 100
  • - gravity center centrar la próxima operación
  • -extent 100x100 aplicar la imagen a un lienzo de 100x100
  • +profile "*" no guarde ninguna metainformación en el JPEG (haciendo que la imagen resultante sea más pequeña)
Jonás Braun
fuente
3
Cuando lo usé en la línea de comando (magia de gráficos uno) obtuve una imagen en el centro, dos lados están llenos de blanco. No el que se describe en cuestión. ¿Estoy haciendo algo mal?
Umut Benzer
2
Si está utilizando ventanas, debe duplicar el carácter ^ para escapar de él. Por ejemplo: 100x100 ^^
George Filippakos
3
¿Por qué no tamaño 100x100?
Hola Mundo
@HelloWorld: Lea "Imagemagick Geometry". Google, será fácil de encontrar.
saurabheights
11

Esa es una manera más simple de hacerlo:

El siguiente comando cambia el tamaño del lado más pequeño a 100 píxeles y recorta un cuadrado de 100x100. Puede agregar un -stripcomando para reducir el tamaño del archivo.

convert original.jpg -resize "100^>" -gravity center \ 
                     -crop 100x100+0+0 -strip thumbnail.jpg

A diferencia de otros, no está tratando de ahorrar memoria. En cambio, hace lo que quieres, y no más. Además, no aumentará las imágenes.

Reinaldo Guedes
fuente
Al agregar una respuesta tardía a una pregunta con respuestas establecidas, es útil proporcionar una explicación suficiente de por qué su respuesta ofrece algo único y nuevo en comparación con las otras respuestas.
Jason Aller
2
Gracias, no sé por qué los demás complicaron demasiado sus respuestas para tratar de ahorrar memoria cuando OP no menciona nada al respecto.
confundido00
2

Estoy usando graphicsmagick para generar miniaturas de tamaño preciso, pero estoy rellenando la imagen con un tablero de ajedrez en lugar de recortar el saliente.

gm convert -limit Threads 1 -size 320x180 pattern:checkerboard -background transparent -gravity center -resize 320x180 -extent 320x180 original.jpg -flatten -resize 112x65! -interlace Line 1 thumb_112x65.jpg

Opciones explicadas.

gm convert

// Single threaded seems faster on smaller files
-limit Threads 1 

// Generate a checkerboard of size 320x180.
// Sets the relative size of the checkerboard squares,
// also sets the desired aspect ratio. In my case (16:9)
-size 320x180 pattern:checkerboard 

// Resize the input image and center it on a transparent layer.
-background transparent -gravity center -resize 320x180 -extent 320x180 orig.jpg

// Merge the layers
-flatten 

// Resize the output to the desired
// The ! causes the aspect ratio to be ignored, fixing any rounding errors.
// (Specify a size with the same aspect ratio as the checkerboard.)
-resize 112x65! 

// Use Progressive JPEG Encoding
-interlace Line 

// Output Image
thumb_112x65.jpg
Ryan Williams
fuente
1

Creo que estás buscando algo como:

convert -crop 100x100+50+50 input_image.jpg output_image.jpg 

donde 100x100es el tamaño del rectángulo final y 50x50el desplazamiento .

pconcepcion
fuente
Esa imagen recortada, pero no hace miniatura.
marioosh
1
@marioosh: No entendí, puede usar convert -thumbnail 100x100+50+50 input_image.jpg output_image.jpg, para obtener más información, verifique la respuesta de Igancio Vázquez como ejemplo o consulte la documentación
pconcepcion
1

Este comando recorta a un cuadrado y luego cambia el tamaño a 150x150

convert 824-full.jpg -set option:size '%[fx:min(w,h)]x%[fx:min(w,h)]' xc:none +swap -gravity center -composite -resize 150x150  temp.jpg

Aquí hay más opciones disponibles: http://www.imagemagick.org/Usage/thumbnails/#square

michaelbn
fuente