ImageMagick для пакетной обработки изображений в Linux

Когда в каталоге лежат десятки фотографий, менять их размер вручную неудобно. ImageMagick решает такую задачу из командной строки: один запуск обрабатывает выбранные файлы, сохраняет нужные пропорции и может привести все снимки к единому формату или ограничению по ширине.

Ниже разобрано, как изменить размер изображений пакетно в Linux с помощью ImageMagick: от установки пакета и проверки версии до рекурсивного обхода каталогов. Примеры рассчитаны на Bash; перед массовым запуском полезно работать с копией исходных файлов.

Установка ImageMagick и проверка команд

В Debian и Ubuntu пакет устанавливается через APT, в Fedora и Rocky Linux — через DNF, а в Arch Linux — через Pacman. Команда sudo нужна для записи системных файлов, хотя на некоторых настроенных системах пакет можно установить без административных прав.

# Debian и Ubuntu
sudo apt update && sudo apt install imagemagick

# Fedora и Rocky Linux
sudo dnf install ImageMagick

# Arch Linux
sudo pacman -S imagemagick

В ImageMagick 7 основной программой является magick, а в более старой версии изображения обрабатывались командой convert. Проверьте доступную версию и наличие нужных форматов. Если magick не найден, используйте convert с теми же параметрами.

magick -version
identify -version
magick -list format

Изменение размеров файлов в одной папке

Сначала создайте отдельный каталог для результатов, чтобы не перезаписывать оригиналы. Цикл ниже обрабатывает все JPEG-файлы текущего каталога и записывает уменьшенные копии с теми же именами в папку resized.

mkdir -p resized

for file in *.jpg; do
    [ -e "$file" ] || continue
    magick "$file" -resize '1200x800>' "resized/$file"
done

Геометрия 1200x800 задаёт ограничивающий прямоугольник, а символ > запрещает увеличивать небольшие изображения. По умолчанию ImageMagick сохраняет пропорции сторон. Кавычки вокруг $file позволяют корректно обрабатывать имена с пробелами, а расширение .jpg в пути назначения определяет формат вывода.

Пропорции, кадрирование и геометрия

Для изменения масштаба доступны несколько вариантов геометрии. Значение 1200x ограничивает только ширину, 50% уменьшает изображение вдвое, а запись 1200x800^ подбирает масштаб так, чтобы обе стороны покрывали заданный прямоугольник. Последний вариант обычно применяют вместе с кадрированием.

magick photo.jpg -resize '1600x900^' \
    -gravity center -extent 1600x900 wide-photo.jpg

Параметр -gravity center определяет положение лишних частей, а -extent 1600x900 обрезает итоговый кадр до точных размеров. Если фотография содержит EXIF-метку с ориентацией, сначала используйте -auto-orient: тогда поворот будет учтён до масштабирования и обрезки.

Форматы, качество и обработка цвета

Пакетная обработка может одновременно менять размер и формат. В следующем примере JPEG-файлы преобразуются в WebP, очищаются от лишних метаданных и сохраняются с качеством 82.

mkdir -p webp

for file in *.jpg; do
    [ -e "$file" ] || continue
    name="${file##*/}"
    stem="${name%.*}"
    magick "$file" -auto-orient -strip -resize '1600x1600>' \
        -quality 82 "webp/$stem.webp"
done

Для JPEG и WebP параметр -quality влияет на потерю сжатия: значения около 80–85 обычно дают хороший баланс размера и качества. PNG использует преимущественно сжатие без потерь. Команда -strip удаляет EXIF и цветовые профили, поэтому при точном воспроизведении цвета её лучше не применять. Готовые файлы можно сверить через сервис просмотра SharePoint, если результат предназначен для корпоративной библиотеки.

Обработка разных расширений без потери структуры

Обычный цикл легко расширить на JPEG, PNG и другие поддерживаемые типы. Поиск через find с разделителем нуля безопасен для имён с пробелами, а параметр -maxdepth 1 ограничивает обработку текущим каталогом.

mkdir -p webp

while IFS= read -r -d '' file; do
    name="${file##*/}"
    stem="${name%.*}"
    magick "$file" -auto-orient -thumbnail '1200x1200>' \
        "webp/$stem.webp"
done < <(
    find . -maxdepth 1 -type f \
        \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' \) \
        -print0
)

Следите за совпадением имён: файлы photo.jpg и photo.png получат одинаковое имя photo.webp, после чего один результат заменит другой. Для таких случаев используйте разные подкаталоги или добавляйте расширение исходника к имени. Анимированные GIF и многостраничные TIFF требуют отдельной настройки, иначе может обработаться только первый кадр.

Рекурсивный обход и безопасное сохранение

Чтобы обработать все вложенные каталоги, сохраните исходную структуру внутри папки назначения. Скрипт создаёт необходимые подпапки автоматически и меняет размер JPEG, PNG и WebP до ограничения 1600 пикселей.

source="$PWD/photos"
destination="$PWD/resized"

find "$source" -type f \
    \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.webp' \) \
    -print0 |
while IFS= read -r -d '' file; do
    relative="${file#"$source"/}"
    target="$destination/$relative"
    mkdir -p "$(dirname "$target")"
    magick "$file" -auto-orient -resize '1600x1600>' "$target"
done

Исходный и конечный пути должны различаться: иначе команда может начать обработку только что созданных файлов. Сначала запустите скрипт на небольшой копии, проверьте несколько результатов и только затем обрабатывайте весь архив. Разделитель -print0 предотвращает ошибки с пробелами и специальными символами в именах.

Проверка результата и автоматизация

После обработки сравните количество исходных и полученных файлов. Утилита identify покажет ширину и высоту каждого изображения, что помогает найти фотографии, не изменившие масштаб или получившие неожиданные пропорции.

find resized -type f -iname '*.jpg' \
    -exec identify -format '%f: %wx%h\n' '{}' \;

find photos -type f \( -iname '*.jpg' -o -iname '*.jpeg' \) | wc -l
find resized -type f \( -iname '*.jpg' -o -iname '*.jpeg' \) | wc -l

Для повторяемых задач сохраните команды в исполняемом сценарии Bash, добавьте set -euo pipefail и настройте журнал выполнения. Проверка поддержки WebP выполняется командой magick -list format | grep -i webp. Если изображения публикуются в блоге, полезно свериться с практикой для WordPress: заранее подготовленные файлы экономят трафик и ускоряют загрузку страниц.

Начните с тестовой папки, создайте для неё отдельный каталог результатов и запустите базовый цикл с ограничением 1200x800>. Проверьте несколько изображений в исходном и уменьшенном виде, затем добавьте нужные форматы, качество и рекурсивный обход. Сохраните готовую команду в сценарии и используйте её для регулярной обработки новых фотографий.

Иконка пользователя в серых тонах

Настройка Windows

Доступ к скрытым параметрам конфигурации, отключение телеметрии, работа с диспетчером задач и тонкая настройка меню «Пуск» в стиле Windows XP для Windows 7.

Иконка браузера в серо-синих тонах

Веб-браузеры

Скрытые страницы конфигурации в Firefox, Chrome и Opera, быстрый текстовый редактор прямо в браузере, эффект Lightbox JS для изображений и настройка внешнего вида Firefox.

Иконка папки в нейтральных серых тонах

WordPress и блоги

Выполнение PHP-кода в текстовых виджетах, диагностика времени загрузки разделов страницы, правильная очистка блога и условная загрузка виджетов социальных сетей.

Изометрический 3D-рендер: светлый веб-сайт с серо-голубым заголовком, парящий над чистой белой поверхностью Изометрический 3D-рендер: тёмно-серая иконка социального букмаркинга на светлом фоне

Обратная связь

Есть вопрос или предложение по темам блога? Напишите — автор на связи.