Bash · 30.01.2026

JPG: уменьшить и сжать

Привести коллекцию изображений к одной ширине и обеспечить компрессию — вот задача для скрипта-сабжа сегодняшнего поста. Логика скрипта должна быть максимально линейной и достаточно простой: нашёл изображение в формате jpg, уменьшил размер (разумеется, с соблюдением пропорций), провёл сжатие и сохранил рядом с оригиналом.

Код получился таким:

#!/bin/bash

# Проверка наличия команды convert #
if ! command -v convert &> /dev/null; then
    echo "Команда 'convert' не найдена. Убедитесь, что ImageMagick установлен."
    exit 1
fi

# Проверка наличия команды jpegoptim #
if ! command -v jpegoptim &> /dev/null; then
    echo "Команда 'jpegoptim' не найдена. Убедитесь, что jpegoptim установлен."
    exit 1
fi

# Новый размер #
new_width=1280

# Оптимизация #
optim=80

for file in *.jpg; do
    # Получаем оригинальные размеры #
    original_dimensions=$(identify -format "%[fx:w] %[fx:h]" "$file")
    original_width=$(echo $original_dimensions | cut -d ' ' -f 1)
    original_height=$(echo $original_dimensions | cut -d ' ' -f 2)

    # Рассчитываем новую высоту с учетом пропорций #
    # Округление до целого числа и передача данных в калькулятор #
    new_height=$(echo "scale=0; $original_height * $new_width / $original_width" | bc)

    # Изменяем размер изображения #
    convert -resize ${new_width}x${new_height}! "$file" "resize_$file"

    # Оптимизируем JPEG с помощью jpegoptim #
    jpegoptim --max=$optim "resize_$file"
done

Обратите внимание, что в переменной new_width указана ширина нового файла (в моём случае ей присвоено значение 1280 пикселей), а переменная optim (указал 80%) отвечает за передачу процента компрессии утилите jpegoptim.

Скрипт ищет файлы для обработки в той же папке, где находится сам. Для моих целей этот метод оправдан, как и приставка resize_ для оптимизированных изображений. При желании можно перестроить под свои цели и потребности.

И, конечно, в системе должны присутствовать утилиты convert и jpegoptim. Без них чуда не произойдёт.