Привести коллекцию изображений к одной ширине и обеспечить компрессию — вот задача для скрипта-сабжа сегодняшнего поста. Логика скрипта должна быть максимально линейной и достаточно простой: нашёл изображение в формате 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. Без них чуда не произойдёт.