Cambiar el tamaño de una imagen en la consola

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

Comentarios
  1. 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.

    Responder

  2. ¿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.

    Responder

  3. @Ellohir pues en bash creo que sería algo así:

    for img in $(ls *.jpg); do convert -resize 1200x $img $img_salida; done

    Responder

  4. ¡Gracias!

    Responder

  5. 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

    Responder

  6. Mierda, metí la gamba de nuevo al recorrer el árbol de directorios…

    Responder

  7. ¡¡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 ^^

    Responder

  8. Cada día me convenzo mas del poder de la consola y de lo inútil que seria la vida sin ella

    Responder

  9. ¿Alguien sabe si con convert se puede escribir texto en una imagen y como?
    Gracias

    Responder

  10. Para escribir texto en una imagen puedes usar la opción -draw

    Responder

  11. […] mayor informacion en el blog de mundogueek.net, tienen mas explicado todo lo que se puede hacer […]

    Responder

  12. Luispo

    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

    Responder

  13. Jmcastell

    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!!!

    Responder

Deja un comentario