Пакетное изменение размеров изображений, когда одна сторона слишком велика (Linux)

Я знаю, что изменение размера изображения в командной строке - это то, что может сделать ImageMagick, и, к сожалению, подобное может сделать, к сожалению, у меня есть только самые базовые возможности сценариев bash, поэтому мне интересно, возможно ли это вообще:

  • проверить все каталоги и подкаталоги для всех файлов, которые являются изображениями
  • проверьте ширину и высоту изображения
  • если какой-либо из них превышает X, количество пикселей изменяет его до X, сохраняя соотношение сторон.
  • заменить старый файл новым (старый файл должен быть удален / удален)

Спасибо за любой вклад.

1 ответ

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

  find \                                         # 1
    ~/Downloads \                                # 2
    -type f \                                    # 3
    -exec file \{\} \; \                         # 4
| awk -F: '{if ($2 ~/image/) print $1}' \        # 5
| while IFS= read -r file_path; do \             # 6
    mogrify -resize 1024x1024\> "$file_path"; \  # 7
  done                                           # 8

Строки 1-4 - это вызов find команда:

  1. Укажите каталог для сканирования.
  2. Укажите только нужные вам файлы.
  3. За каждый найденный элемент запускается fileкоманда. Примеры выходных данных для каждого файла:

    • /Downloads/391A6 625.png: PNG image data, 1024 x 810, 8-bit/color RGB, interlaced
    • /Downloads/STRUCTURED NODES IN UML 2.0 ACTIVITES.pdf: PDF document, version 1.4

    Обратите внимание, как имена файлов отделяются от информации : а информация о PNG содержит imageслово. Это также будет верно для других форматов изображений.

  4. Использовать awk фильтровать только те файлы, в которых imageслово в их информации. Это дает нам только файлы изображений. Вот,-F: указывает, что разделитель :. Это дает нам переменную$1 содержать исходное имя файла и $2для информации о файле. Мы ищемimage слово в информации о файле и напечатать имя файла, если оно присутствует.

  5. Это немного сложно. Строки 6-8 читают выводawk строка за строкой и вызывать mogrifyкоманда для изменения размера изображений. Здесь мы не используем трубопроводы иxargs, как если бы пути к файлам содержали пробелы или другие символы, которые необходимо экранировать, мы получим xargs unterminated quote ошибки, и с этим трудно справиться.
  6. Вызвать mogrifyкоманда ImageMagic. В отличие отconvert, которая также является командой ImageMagic, mogrifyизменяет файлы на месте без создания новых. Вот,1024x1024\> сообщает, что размер изображения должен быть максимальным 1024x1024. В\>Часть говорит о сохранении соотношения сторон, чтобы конечное изображение имело наибольшую сторону 1024 пикселей. Другая сторона будет меньше, если исходное изображение не квадратное. Обратите внимание на;, так как это нужно внутри петель.

Обратите внимание, запускать безопасно mogrifyнесколько раз для одного и того же файла: если размер файла уже соответствует вашим целевым размерам, он больше не будет изменен. Однако это изменит время модификации файла.

Кроме того, вам может потребоваться не только изменить размер изображений, но и сжать их. Пожалуйста, обратитесь к моей сути, чтобы узнать, как это можно сделать: https://gist.github.com/oblalex/79fa3f85f05924017d25004496493adb

Если ваша цель - уменьшить размер больших изображений, например больше 300 КБ, вы можете:

  • find /path/to/dir -type f -size +300k
  • и, как и прежде, объедините его с mogrify -strip -interlace Plane -format jpg -quality 85 -define jpeg:extent=300KB "$FILE_PATH"

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

Вы можете сделать это с помощью сценария оболочки bash unix, зацикливающегося на ваших каталогах. Вы должны указать все форматы файлов, которые вам нужны, такие как jpg и png и т. Д. Затем для каждого каталога выполните цикл по каждому файлу из указанного списка форматов. Затем используйте ImageMagick для изменения размера файлов.

cd
dirlist="path2/directory1 path2/directory2 ...."
for dir in $dirlist; do
cd "$dir"
imglist=`ls | grep -i ".jpg\|.png"`
for img in $imglist; do
convert $img -resize "200x200>" $img
done
done

Смотрите https://www.imagemagick.org/script/command-line-processing.php

Другие вопросы по тегам