Cambiar el tamaño de las imágenes por lotes a una nueva carpeta usando ImageMagick


Tengo una carpeta de imágenes sobre 4MB - llamemos a esta carpeta dsc_big/. Me gustaría usar convert -define jpeg:extent=2MB para convertirlos a bajo 2MB y copiar dsc_big/* a una carpeta dsc_small/ que ya existe.

Lo intenté convert dsc_big/* -define jpeg:extent=2MB dsc_small/ pero eso produce imágenes llamadas -0, -1, y así sucesivamente.

¿Qué hago?

Author: Chris Martin, 2012-01-03

6 answers

convert está diseñado para manejar un solo archivo de entrada por lo que puedo decir, aunque tengo que admitir que no entiendo la salida que está recibiendo. mogrify es más adecuado para el procesamiento por lotes en el siguiente estilo:

mogrify -path ../dsc_small -define jpeg:extent=2MB dsc_big/*

Pero honestamente lo considero peligroso para el uso general (sobrescribirá las imágenes originales si se olvida que -path) por lo que siempre uso convert junto con un bucle for para esto:

for file in dsc_big/*; do convert $file -define jpeg:extent=2MB dsc_small/`basename $file`; done

La llamada basename no es necesaria si está procesando archivos en el directorio actual.

 49
Author: Eduardo Ivanec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-03 04:51:39

Este fue el comando que me ayudó después de un largo intento. Quería hacer miniaturas del mismo tamaño de una gran lista de imágenes grandes que tienen ancho y altura variables . Era para crear una página de galería.

convert -define jpeg:size=250x200 *.jpg  -thumbnail 250x200^ -gravity center -extent 250x200  crop/thumbnail-%d.jpeg

Tengo miniaturas de nuevo tamaño que tienen el mismo ancho y alto. :) gracias a ImageMagick.

 4
Author: sajin tm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-25 20:03:13

Aquí hay una solución sin usando bucles for en la consola

convert *.jpeg -define jpeg:extent=2MB -set filename:f '../dsc_small/%t_small.%e' +adjoin '%[filename:f]'
 3
Author: Nacho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-01 23:48:15

Aunque esta es una vieja pregunta, pero estoy agregando esta respuesta para el beneficio de cualquier otra persona que tropiece con esto.

Tuve exactamente el mismo problema, y siendo desalentado por el uso de mogrify, escribí una pequeña utilidad basada en Python llamada easymagick para hacer este proceso más fácil mientras se usa internamente el comando convert.

Tenga en cuenta que esto todavía es un trabajo en progreso. Apreciaré cualquier tipo de retroalimentación que pueda obtener.

 1
Author: Danish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-10 20:55:56

Esto funciona para mí

convert -rotate 90 *.png rotate/image.jpg 

Produce image-0.jpg, imagen-1.jpg, imagen-2.jpg ..... en la carpeta 'rotar'. Sin embargo, no sé de una manera de preservar los nombres de archivo originales.

 0
Author: Khawar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-29 08:00:47

Encontré que cd-ing en la carpeta deseada, y luego usando la variable global bash $PWD hizo que mi convert no arrojara ningún error. Estoy utilizando ImageMagick recientemente implementado caption: http://www.imagemagick.org/Usage/text/#caption función para etiquetar mis imágenes con el nombre de archivo base y colocarlas en otro directorio dentro del primero.

cd ~/person/photos
mkdir labeled
for f in $PWD/*.JPG; do
    width=$(identify -format %w $f)
    filename=$(basename $f .JPG)
convert -background '#0008' -colorspace transparent -fill white -gravity center -size ${width}x100  caption:"${filename}" ${f} +swap -gravity south -composite "$PWD/labeled/${filename}.jpg";
done
 0
Author: Valerie Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-15 23:05:26