En Mundo geek ya hemos hablado alguna que otra vez de ImageMagick, una popular suite open source para manipulación de imágenes. Lo hicimos, por ejemplo, en Cómo convertir un archivo pdf en imágenes. Esta vez lo vamos a utilizar para modificar el tamaño de nuestras imágenes.
Por supuesto existen montones de alternativas, como el script para Nautilus de javielinux (que utiliza ImageMagick por debajo), pero una vez en la consola la lista de opciones se reduce considerablemente.
El comando de ImageMagick a utilizar es convert
, con el que podemos hacer cosas como unir imágenes, convertir entre formatos de imágenes, difuminar, añadir textos, establecer un color como transparente, etc.
El flag que nos interesa del comando convert
es -resize
. Como parámetro tendremos que pasar el nuevo tamaño que queremos que tenga la imagen. Por ejemplo:
convert -resize 1200×1200 imagen.jpg imagen_salida.jpg
Por defecto convert
no alterará la relación de aspecto de la imagen, por lo que el tamaño de la imagen resultante no tiene por qué ser el que indiquemos. Si hubieramos aplicado el comando anterior a una imagen de 1600×1200, por ejemplo, el tamaño de la imagen resultante habría sido de 1200×900 (el ancho sigue siendo 1,33 mayor que el largo).
Si queremos que se altere la relación de aspecto, deformando así la imagen, basta con añadir \!
al tamaño:
convert -resize 1200×1200\! imagen.jpg imagen_salida.jpg
Si no vamos a cambiar la relación de aspecto también podemos especificar tan solo el ancho o el largo:
convert -resize 1200x imagen.jpg imagen_salida.jpg
convert -resize x1000 imagen.jpg imagen_salida.jpg
E incluso podemos utilizar porcentajes en lugar de indicar las dimensiones en píxeles:
convert -resize 50% imagen.jpg imagen_salida.jpg
convert -resize 200% imagen.jpg imagen_salida.jpg
Para más información sobre el redimensionado de imágenes con ImageMagick, como el uso de filtros o el reescalado líquido, podéis consultar la documentación de su web
Imagemagick es una de las mejores aplicaciones que existen para el manejo de imágenes en linux desde la consola, y sobre todo fundamental tenerla en servidores web para aumentar las posibilidades de las aplicaciones/cms (o lo que sea) instalados.
¿Y un shell script para reducir un montón de imágenes a la vez? Tengo cientos de fotos a tres o cuatro megapíxeles que no me importaría sacrificar en calidad hasta un megapixel.
@Ellohir pues en bash creo que sería algo así:
for img in $(ls *.jpg); do convert -resize 1200x $img $img_salida; done
¡Gracias!
Bueno, para los que tengan curiosidad, así es como he dejado mi script. Recorre todos los subdirectorios y redimensiona las fotos a un ancho de 1024 píxeles.
#!/bin/bash
for i in *; do
cd $i
for img in $(ls *.JPG); do
convert -resize 1024x $img "red_"$img;
rm $img
done
for img in $(ls *.jpg);
do
convert -resize 1024x $img "red_"$img;
rm $img
done
cd ..
done
Mierda, metí la gamba de nuevo al recorrer el árbol de directorios…
¡¡Muajajaja, al fin, la versión perfeccionada y requeteprobada (con carpetas con menos de seis espacios en el nombre)!!
ellohir@formenos:~$ cat /usr/bin/redimensionar_imagenes
#!/bin/bash
for img in $(ls *.JPG 2>/dev/null);
do
echo "Redimensionando $PWD/$img"
convert -resize 1024x $img "red_"$img 2>/dev/null;
rm $img 2>/dev/null
done
for img in $(ls *.jpg 2>/dev/null);
do
echo "Redimensionando $PWD/$img"
convert -resize 1024x $img "red_"$img 2>/dev/null;
rm $img 2>/dev/null;
done
if [ $# -gt 0 ]; then
if [ $1 = "-r" ]; then
directorios=$(vdir | grep '^d' | awk -F' ' '{print $8$9$10$11$12;}');
for i in $directorios; do
dir_actual=$(echo $i | awk -F'\' '{print $1 " " $2}');
cd "$dir_actual"
redimensionar_imagenes $1
done
fi
fi
Gracias Zootropo por darme la idea y por la ayuda prestada ^^
Ey, pues gracias por el curro Ellohir 🙂
Cada día me convenzo mas del poder de la consola y de lo inútil que seria la vida sin ella
¿Alguien sabe si con convert se puede escribir texto en una imagen y como?
Gracias
Para escribir texto en una imagen puedes usar la opción
-draw
Pingback: Cambiar tamaño de una imagen desde la consola Linux « ramirex
Dejo el mío, que lo acabo de ejecutar y funciona a las mil maravillas. Solo hace falta crear en el mismo directorio en el que estén las imágenes un directorio llamado jpg, por ejemplo:
for img in $(ls *.JPG); do convert -resize 768x $img jpg/$img; done
Sencillo y potente ;). Con un comando redimensionamos todos los jpg’s y los movemos al directorio llamada jpg
Q tal amigos buen dia, tengo una consulta ya que yo cree mi script asi:
#!/bin/bash
for i in *.jpg;
do
convert $i -resize 1024×768 com$i;
done
y lo que quiero es que haga el resize a las imagenes que se encuentran en la carpeta. pero tengo el problema que los nombres de las imagenes contienen espacios en blanco. y cuando ejecuto mi script me da error tal como:
nombre de la imagen: 30152818_2013-03-21 15.31.20.jpg
convert: unable to open image `30152818_2013-03-21′: @ error/blob.c/OpenBlob/2587.
convert: no decode delegate for this image format `30152818_2013-03-21′ @ error/constitute.c/ReadImage/532.
convert: unable to open image `15.31.20.jpg’: @ error/blob.c/OpenBlob/2587.
convert: unable to open image `com30152818_2013-03-21′: @ error/blob.c/OpenBlob/2587.
convert: no decode delegate for this image format `com30152818_2013-03-21′ @ error/constitute.c/ReadImage/532.
convert: missing an image filename `15.31.20.jpg’ @ error/convert.c/ConvertImageCommand/3011.
alguien me puede ayudar con este problemita…
Gracias!!!