LinuxParty

Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado
 

Este script utiliza ImageMagick y jpegoptim para convertir imágenes a JPEG, reducir su tamaño, corregir su orientación y prepararlas para publicarlas en una página web

El formato WebP permite almacenar imágenes con una buena relación entre calidad y tamaño, por lo que se ha convertido en una opción habitual en páginas web, gestores de contenidos y servicios de imágenes.

Sin embargo, todavía encontramos aplicaciones, editores y procedimientos de trabajo que funcionan mejor con archivos JPG. También puede ocurrir que descarguemos una imagen WebP y necesitemos convertirla antes de editarla, enviarla o incorporarla a un proyecto.

Podemos realizar la conversión manualmente mediante ImageMagick, pero cuando hacemos este trabajo con frecuencia resulta mucho más cómodo disponer de un script que automatice todo el proceso.

El script convierteimagen.sh convierte imágenes WebP, PNG, JPEG, GIF y otros formatos compatibles con ImageMagick a JPG. De forma predeterminada, limita su anchura a 1.200 píxeles y optimiza el resultado mediante jpegoptim.

Qué hace el script

El funcionamiento predeterminado es sencillo. Si le entregamos un archivo llamado:

fotografia.webp 

El script generará:

fotografia-cvd.jpg

(-cvd, es nuestra firma, pon tu la tuya)

El archivo original no se modifica ni se elimina.

Durante el proceso, el script realiza diferentes operaciones:

  • Comprueba que la imagen de entrada existe.
  • Detecta si el sistema utiliza magick o el antiguo comando convert.
  • Corrige automáticamente la orientación indicada por los datos EXIF.
  • Sustituye las transparencias por un fondo blanco.
  • Mantiene la proporción original de la imagen.
  • Reduce la anchura a un máximo de 1.200 píxeles.
  • Evita ampliar imágenes que ya sean más pequeñas.
  • Convierte el resultado al formato JPEG.
  • Optimiza el archivo mediante jpegoptim.
  • Elimina metadatos innecesarios.
  • Admite nombres de archivos que contienen espacios.
  • Puede procesar varias imágenes en una sola ejecución.
  • No sobrescribe archivos existentes sin autorización.

También permite elegir otra anchura, modificar la calidad del JPEG o realizar la conversión sin cambiar las dimensiones.

Instalar las dependencias

El script necesita dos herramientas: ImageMagick y jpegoptim.

ImageMagick se encarga de leer, transformar y convertir las imágenes. jpegoptim realiza la optimización final del archivo JPEG.

En Fedora podemos instalarlas con:

sudo dnf install ImageMagick jpegoptim

En Debian, Ubuntu, Linux Mint y distribuciones derivadas utilizaremos:

sudo apt update
sudo apt install imagemagick jpegoptim

Para comprobar que ambas herramientas están disponibles podemos ejecutar:

magick -version
jpegoptim --version

En sistemas que todavía utilicen ImageMagick 6, es posible que el primer comando se llame convert:

convert -version

El script detecta automáticamente cuál de los dos está disponible.

Crear el script

Podemos guardar el programa en /usr/local/bin, una ubicación apropiada para scripts instalados localmente y disponibles para todos los usuarios del equipo.

Abrimos el archivo con nuestro editor:

sudo nano /usr/local/bin/convierteimagen.sh

Pegamos el siguiente contenido:

 

#!/usr/bin/env bash

# Convierte imágenes a JPG y las optimiza para su publicación web.
# Salida predeterminada: nombre-original-cvd.jpg

set -o pipefail

PROGRAMA="${0##*/}"
ANCHO=1200
CALIDAD=96
NO_RESIZE=0
SOBRESCRIBIR=0

# Colores
if [[ -t 1 ]]; then
    AMARILLO='\033[33m'
    CIAN='\033[36m'
    ROJO='\033[31m'
    VERDE='\033[32m'
    NC='\033[0m'
else
    AMARILLO=''
    CIAN=''
    ROJO=''
    VERDE=''
    NC=''
fi

mostrar_ayuda() {
    cat <<EOF
Uso:
  $PROGRAMA [OPCIONES] imagen [imagen2...]

Convierte una o varias imágenes a formato JPG, limita su anchura y
optimiza el resultado con jpegoptim.

El archivo generado tendrá este formato:

  nombre-original-cvd.jpg

Opciones:
  -nr, -n, --noresize, --no-resize
                         No cambia las dimensiones de la imagen.

  -w, --width PÍXELES    Establece la anchura máxima.
                         Valor predeterminado: 1200 píxeles.

  -q, --quality NÚMERO   Calidad JPEG entre 1 y 100.
                         Valor predeterminado: 96.

  -f, --force            Sobrescribe el archivo de salida si ya existe.

  -h, --help             Muestra esta ayuda.

Ejemplos:
  $PROGRAMA imagen.webp

  $PROGRAMA --no-resize imagen.webp

  $PROGRAMA -nr imagen.webp

  $PROGRAMA --width 1600 --quality 90 imagen.png

  $PROGRAMA --force "imagen con espacios.webp"

  $PROGRAMA *.webp

Comportamiento:
  - Convierte WebP, PNG, JPEG, GIF y otros formatos admitidos por
    ImageMagick.
  - Mantiene la proporción original.
  - No amplía imágenes cuya anchura ya sea menor que el límite indicado.
  - Sustituye las transparencias por un fondo blanco.
  - Corrige la orientación indicada por los datos EXIF.
  - Elimina metadatos durante la optimización.
  - No borra ni modifica el archivo original.

Dependencias:
  ImageMagick y jpegoptim.

Instalación de dependencias:

  Fedora:
    sudo dnf install ImageMagick jpegoptim

  Debian y Ubuntu:
    sudo apt install imagemagick jpegoptim
EOF
}

error() {
    printf '%bError: %s%b\n' "$ROJO" "$*" "$NC" >&2
}

comprobar_entero() {
    [[ "$1" =~ ^[0-9]+$ ]]
}

# Procesamiento de opciones
while [[ $# -gt 0 ]]; do
    case "$1" in
        -h|--help)
            mostrar_ayuda
            exit 0
            ;;

        -nr|-n|--noresize|--no-resize)
            NO_RESIZE=1
            shift
            ;;

        -w|--width)
            if [[ $# -lt 2 ]]; then
                error "falta el número de píxeles para $1."
                exit 2
            fi

            ANCHO="$2"

            if ! comprobar_entero "$ANCHO" || (( ANCHO < 1 )); then
                error "la anchura debe ser un número entero positivo."
                exit 2
            fi

            shift 2
            ;;

        -q|--quality)
            if [[ $# -lt 2 ]]; then
                error "falta el valor de calidad para $1."
                exit 2
            fi

            CALIDAD="$2"

            if ! comprobar_entero "$CALIDAD" ||
               (( CALIDAD < 1 || CALIDAD > 100 )); then
                error "la calidad debe estar comprendida entre 1 y 100."
                exit 2
            fi

            shift 2
            ;;

        -f|--force)
            SOBRESCRIBIR=1
            shift
            ;;

        --)
            shift
            break
            ;;

        -*)
            error "opción desconocida: $1"
            printf 'Utiliza "%s --help" para consultar la ayuda.\n' "$PROGRAMA" >&2
            exit 2
            ;;

        *)
            break
            ;;
    esac
done

if [[ $# -eq 0 ]]; then
    mostrar_ayuda
    exit 1
fi

# ImageMagick 7 utiliza "magick"; las versiones anteriores, "convert".
if command -v magick >/dev/null 2>&1; then
    IMAGEMAGICK=(magick)
elif command -v convert >/dev/null 2>&1; then
    IMAGEMAGICK=(convert)
else
    error "no se encuentra ImageMagick."
    printf 'Instálalo con "sudo dnf install ImageMagick" o '
    printf '"sudo apt install imagemagick".\n'
    exit 3
fi

if ! command -v jpegoptim >/dev/null 2>&1; then
    error "no se encuentra jpegoptim."
    printf 'Instálalo con "sudo dnf install jpegoptim" o '
    printf '"sudo apt install jpegoptim".\n'
    exit 3
fi

PROCESADAS=0
ERRORES=0

for ENTRADA in "$@"; do
    if [[ ! -f "$ENTRADA" ]]; then
        error "no existe o no es un archivo: $ENTRADA"
        ((ERRORES++))
        continue
    fi

    DIRECTORIO=$(dirname -- "$ENTRADA")
    ARCHIVO=$(basename -- "$ENTRADA")
    NOMBRE="${ARCHIVO%.*}"
    SALIDA="${DIRECTORIO}/${NOMBRE}-cvd.jpg"

    if [[ "$ENTRADA" == "$SALIDA" ]]; then
        error "el archivo de entrada y el de salida son el mismo."
        ((ERRORES++))
        continue
    fi

    if [[ -e "$SALIDA" && "$SOBRESCRIBIR" -ne 1 ]]; then
        error "ya existe: $SALIDA"
        printf 'Utiliza --force para sobrescribirlo.\n' >&2
        ((ERRORES++))
        continue
    fi

    printf '%b\n' "$AMARILLO"
    echo "---------------------------"
    echo "Entrada"
    echo "---------------------------"
    ls --color=auto -lshF -- "$ENTRADA"
    echo "---------------------------"
    printf '%b' "$NC"

    echo "Convirtiendo:"
    echo "  Origen:  $ENTRADA"
    echo "  Destino: $SALIDA"

    OPCIONES=(
        "$ENTRADA"
        -auto-orient
        -background white
        -alpha remove
        -alpha off
    )

    if [[ "$NO_RESIZE" -eq 0 ]]; then
        # El símbolo > evita ampliar imágenes más pequeñas.
        OPCIONES+=(-resize "${ANCHO}x>")
    fi

    OPCIONES+=(-quality "$CALIDAD" "$SALIDA")

    if ! "${IMAGEMAGICK[@]}" "${OPCIONES[@]}"; then
        error "ImageMagick no pudo convertir: $ENTRADA"
        ((ERRORES++))
        continue
    fi

    if ! jpegoptim \
        --max="$CALIDAD" \
        --strip-all \
        --preserve \
        --quiet \
        "$SALIDA"; then

        error "jpegoptim no pudo optimizar: $SALIDA"
        ((ERRORES++))
        continue
    fi

    printf '%b\n' "$CIAN"
    echo "---------------------------"
    echo "Salida"
    echo "---------------------------"
    ls --color=auto -lshF -- "$SALIDA"
    echo "---------------------------"
    printf '%b' "$NC"

    printf '%bConversión terminada correctamente.%b\n' "$VERDE" "$NC"
    ((PROCESADAS++))
done

echo
echo "Resumen: $PROCESADAS imagen(es) convertida(s), $ERRORES error(es)."

if (( ERRORES > 0 )); then
    exit 1
fi

exit 0

 

Guardamos el archivo y asignamos permiso de ejecución:

sudo chmod 755 /usr/local/bin/convierteimagen.sh

 

Como /usr/local/bin suele formar parte de la variable PATH, podremos ejecutar el script desde cualquier directorio escribiendo simplemente:

convierteimagen.sh

 

Si el sistema no encuentra el comando, podemos comprobar la variable con:

echo "$PATH"

 

También podemos ejecutarlo indicando la ruta completa:

/usr/local/bin/convierteimagen.sh --help

 

Consultar la ayuda

Para ver las opciones disponibles utilizaremos:

convierteimagen.sh --help

 

También está disponible la forma abreviada:

convierteimagen.sh -h

 

La ayuda explica la sintaxis, las opciones, las dependencias y varios ejemplos de utilización.

Convertir una imagen WebP a JPG

Para realizar una conversión normal ejecutamos:

convierteimagen.sh paisaje.webp

 

El resultado será:

paisaje-cvd.jpg

 

Si la imagen tiene más de 1.200 píxeles de anchura, se reducirá manteniendo sus proporciones. Si ya es más pequeña, conservará sus dimensiones originales.

El símbolo > utilizado internamente en la expresión de ImageMagick:

1200x>

 

indica que solamente deben reducirse las imágenes que superen el límite. Esto evita ampliar innecesariamente archivos pequeños y perder calidad.

Convertir sin modificar las dimensiones

Cuando queremos cambiar el formato, pero conservar exactamente el tamaño de la imagen, usamos:

convierteimagen.sh --no-resize imagen.webp

 

También podemos emplear cualquiera de estas formas abreviadas:

convierteimagen.sh -nr imagen.webp

 

convierteimagen.sh -n imagen.webp

 

En este caso se mantiene la resolución original, aunque se siguen aplicando la orientación automática, el fondo blanco, la conversión a JPEG y la optimización.

Elegir otra anchura máxima

La opción --width permite establecer un límite diferente.

Para generar una imagen con una anchura máxima de 1.600 píxeles:

convierteimagen.sh --width 1600 fotografia.webp

 

La forma abreviada es:

convierteimagen.sh -w 1600 fotografia.webp

 

Podemos utilizar esta posibilidad para preparar imágenes destinadas a diferentes partes de una página web.

Por ejemplo, una miniatura podría limitarse a 400 píxeles:

convierteimagen.sh --width 400 miniatura.png

 

Una fotografía grande para un artículo podría limitarse a 1.600:

convierteimagen.sh --width 1600 portada.webp

 

Cambiar la calidad del JPEG

El valor predeterminado de calidad es 96. Produce una imagen de alta calidad, aunque el archivo puede seguir siendo relativamente grande.

Podemos reducirlo para conseguir archivos más ligeros:

convierteimagen.sh --quality 85 imagen.webp

 

La forma abreviada es:

convierteimagen.sh -q 85 imagen.webp

 

La calidad debe expresarse mediante un número comprendido entre 1 y 100.

Para páginas web, un valor situado entre 82 y 90 suele proporcionar un equilibrio razonable entre calidad y tamaño. En fotografías con muchos detalles puede ser conveniente utilizar un valor algo mayor.

También podemos combinar anchura y calidad:

convierteimagen.sh --width 1400 --quality 88 imagen.webp

 

Procesar varias imágenes

El script admite varios archivos en la misma ejecución:

convierteimagen.sh foto1.webp foto2.png foto3.jpeg

 

También podemos utilizar los comodines del intérprete de comandos.

Para convertir todos los archivos WebP del directorio actual:

convierteimagen.sh *.webp

 

Para convertir archivos WebP y PNG:

convierteimagen.sh *.webp *.png

 

Cada imagen genera su propio archivo terminado en -cvd.jpg.

Si tenemos:

cabecera.webp
captura.png
servidor.jpeg

 

Obtendremos:

cabecera-cvd.jpg
captura-cvd.jpg
servidor-cvd.jpg

 

Trabajar con nombres que contienen espacios

Las variables del script están correctamente entrecomilladas, por lo que admite nombres con espacios.

Debemos escribir el nombre entre comillas:

convierteimagen.sh "captura de pantalla.webp"

 

La salida será:

captura de pantalla-cvd.jpg

 

También podemos combinar varios archivos:

convierteimagen.sh "foto del viaje.webp" "captura del escritorio.png"

 

Sobrescribir un resultado existente

Por seguridad, el script no reemplaza una imagen generada anteriormente.

Si ejecutamos:

convierteimagen.sh imagen.webp

 

y ya existe:

imagen-cvd.jpg

 

el programa mostrará un error y conservará el archivo existente.

Si realmente queremos sustituirlo, utilizaremos:

convierteimagen.sh --force imagen.webp

 

O su forma abreviada:

convierteimagen.sh -f imagen.webp

 

Esta protección evita perder accidentalmente una imagen que hayamos editado después de la primera conversión.

Qué ocurre con las transparencias

JPEG no admite transparencia. Si convertimos directamente un PNG o WebP transparente, las zonas vacías pueden aparecer negras dependiendo de la configuración y del programa utilizado.

El script soluciona este problema mediante estas opciones:

-background white
-alpha remove
-alpha off

 

Las áreas transparentes se sustituyen por un fondo blanco antes de generar el JPEG.

Esta decisión es apropiada para la mayoría de fotografías, capturas y contenidos web. Sin embargo, si necesitamos conservar la transparencia debemos mantener el archivo en PNG o WebP, ya que JPEG no puede almacenarla.

Corrección de la orientación

Algunas fotografías tomadas con teléfonos o cámaras no están guardadas físicamente en la orientación en la que se muestran. El dispositivo añade una etiqueta EXIF que indica si deben girarse.

El script utiliza:

-auto-orient

 

Esta opción aplica la orientación correcta antes de eliminar los metadatos. Así evitamos que la imagen aparezca girada después de la optimización.

Por qué se eliminan los metadatos

Las imágenes pueden contener información EXIF, perfiles, comentarios, datos de la cámara e incluso coordenadas geográficas.

jpegoptim recibe la opción:

--strip-all

 

Con ella elimina metadatos que no son necesarios para mostrar la imagen en una página web.

Esto puede reducir ligeramente el tamaño del archivo y evita publicar información privada, como la ubicación donde se tomó una fotografía.

Debemos tener en cuenta que esta eliminación es intencionada. Si necesitamos conservar los metadatos originales, tendremos que modificar el comando de optimización.

Diferencias entre magick y convert

ImageMagick 6 utiliza habitualmente el comando:

convert

 

ImageMagick 7 recomienda utilizar:

magick

 

El script comprueba primero si existe magick. Si no lo encuentra, busca convert.

Gracias a esta detección puede funcionar en distribuciones con diferentes versiones de ImageMagick sin que tengamos que editar el código.

Posibles errores

Si aparece este mensaje:

Error: no se encuentra ImageMagick.

debemos instalar el paquete correspondiente.

En Fedora:

sudo dnf install ImageMagick

En Debian o Ubuntu:

sudo apt install imagemagick

 

Si el programa indica que no encuentra jpegoptim, lo instalaremos con:

sudo dnf install jpegoptim

 

o:

sudo apt install jpegoptim

 

También podemos comprobar que el script tiene permiso de ejecución:

ls -l /usr/local/bin/convierteimagen.sh

 

Los permisos deberían mostrar al menos las marcas de ejecución correspondientes:

-rwxr-xr-x

 

Si no aparecen, ejecutaremos:

sudo chmod 755 /usr/local/bin/convierteimagen.sh

 

Un pequeño script para una tarea repetitiva

La principal utilidad de este programa no está en hacer algo imposible mediante comandos individuales. Su ventaja consiste en reunir en una sola orden todas las operaciones que solemos repetir al preparar una imagen para Internet.

En lugar de recordar varias opciones de ImageMagick, optimizar posteriormente el JPEG y comprobar manualmente los archivos, podemos ejecutar:

convierteimagen.sh imagen.webp

El resultado queda convertido, orientado, redimensionado y optimizado, mientras que la imagen original permanece intacta.

También podemos adaptar el proceso según cada caso mediante las opciones de anchura, calidad, ausencia de redimensionado y sobrescritura.

Es un buen ejemplo de cómo un script Bash relativamente pequeño puede ahorrar tiempo, evitar errores y convertir una tarea repetitiva en una herramienta reutilizable para cualquier sistema Linux.


Metadescripción

Aprende a convertir imágenes WebP y PNG a JPG en Linux mediante un script Bash con ImageMagick y jpegoptim, redimensionado y optimización automática.

Palabras clave

convertir WebP a JPG Linux, convertir PNG a JPG, script Bash imágenes, ImageMagick, jpegoptim, optimizar imágenes Linux, reducir imágenes, convertir imágenes terminal, magick, convert

Texto para redes sociales

Convierte imágenes WebP y PNG a JPG desde Linux con un único comando. Este script Bash redimensiona, corrige la orientación, elimina metadatos y optimiza las imágenes para su publicación web.

Escribir un comentario

Código de seguridad
Refescar



Redes:



   

 

Encuestas

¿Cuál es tu OS de Escritorio en Casa? - 2026

Suscribete / Newsletter

Suscribete a nuestras Newsletter y periódicamente recibirás un resumen de las noticias publicadas.

Donar a LinuxParty

 

Dona a LInuxParty

Donar 10

Donar 20

 

 

Tutorial de Linux

Formulario de acceso