Пакетное изменение размеров изображений, когда одна сторона слишком велика (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
команда:
- Укажите каталог для сканирования.
- Укажите только нужные вам файлы.
За каждый найденный элемент запускается
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
слово. Это также будет верно для других форматов изображений.Использовать
awk
фильтровать только те файлы, в которыхimage
слово в их информации. Это дает нам только файлы изображений. Вот,-F:
указывает, что разделитель:
. Это дает нам переменную$1
содержать исходное имя файла и$2
для информации о файле. Мы ищемimage
слово в информации о файле и напечатать имя файла, если оно присутствует.- Это немного сложно. Строки 6-8 читают вывод
awk
строка за строкой и вызыватьmogrify
команда для изменения размера изображений. Здесь мы не используем трубопроводы иxargs
, как если бы пути к файлам содержали пробелы или другие символы, которые необходимо экранировать, мы получимxargs unterminated quote
ошибки, и с этим трудно справиться. - Вызвать
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