В прошлом месяце мы с женой поехали на выходные в Напу. Это — хорошее место. Там много чем можно занять себя на воздухе, да и ехать туда из Сан-Франциско недалеко.
Мы отлично провели время. А когда вернулись домой и я сбросил на компьютер фотографии, которые снял в путешествии, я обратил внимание на то, что они занимают страшно много места. Я — вовсе не фотограф, хотя мне и очень нравится делать снимки, главная цель которых — сохранить память о чём-то хорошем.
Один из снимков меня прямо-таки зацепил. Это была 12-мегапиксельная фотография козы размером почти в 10 Мб. Такая качественная, что невооружённым глазом этого толком и не оценить. Это навело меня на размышления. Мне хотелось бы сохранить этот снимок — как часть воспоминаний о том, чем мы занимались, но перспектива тратить на него столько дискового пространства меня вовсе не радовала. Снимки такого размера способны довольно быстро заполнить даже немаленький диск. Я понял, что мне нужна программа для пакетного изменения размеров подобных файлов.
Фото козы (3024 × 4032, HEIC), которое было преобразовано в JPG с уменьшением разрешения
Я, кроме прочего, люблю, чтобы вокруг был бы порядок, чтобы у всего было бы своё место. Мне нужно было не только поменять размеры изображений в пакетном режиме. Мне хотелось ещё и сохранить метаданные снимков и EXIF-данные (дату, время, место съёмки и так далее).
Мне не удалось найти инструмент для решения этой простой, но очень важной для меня задачи. Поэтому я задался целью сделать такой инструмент своими силами. После того, как я подобрал подходящие средства разработки и написал, а потом довёл до ума код, сделав его максимально простым и эффективным, у меня получилось то, что показано ниже. В коде имеются комментарии, которые помогут тому, кому это интересно, в нём разобраться. Он поддерживает обработку изображений в форматах JPG и HEIC.
#!/bin/bash
#задаём максимальную ширину изображения в пикселях
maxwidth=2000
#где находятся фотографии?
if [ $# -eq 0 ]; then
imgFolder="untitled folder"
else
imgFolder=$1
fi
cd "$imgFolder"
pwd
#создаём временную папку для хранения изменённых фотографий
if [ -d new ]; then
rm -rf new
fi
mkdir new
#находим все JPG-изображения в заданной папке
fileCnt=$(ls *.[jJ][pP]*[Gg] | wc -l)
cnt=0
echo "Will search for JPGs"
find . -maxdepth 1 -iname '*.jp*g' |
while read file
do
((cnt++))
imgwidth=`sips --getProperty pixelWidth "$file" | awk '/pixelWidth/ {print $2}'`
if [ $imgwidth -gt $maxwidth ]; then
imgheight=`sips --getProperty pixelHeight "$file" | awk '/pixelHeight/ {print $2}'`
#пропускаем панорамные снимки
if [ $((imgwidth / imgheight)) -lt 2 ]; then
echo "$cnt/$fileCnt $file $imgwidth → $maxwidth"
sips -Z $maxwidth "$file" --out new/"$file" > /dev/null 2>&1
touch -r "$file" new/"$file"
fi
fi
done
#находим все HEIC-изображения в заданной папке
fileCnt=$(ls *.HEIC | wc -l)
cnt=0
echo "Will search for HEICs"
find . -maxdepth 1 -iname '*.heic' |
while read file
do
((cnt++))
imgwidth=`sips --getProperty pixelWidth "$file" | awk '/pixelWidth/ {print $2}'`
if [ $imgwidth -gt $maxwidth ]; then
imgheight=`sips --getProperty pixelHeight "$file" | awk '/pixelHeight/ {print $2}'`
if [ $((imgwidth / imgheight)) -lt 2 ]; then
echo "$cnt/$fileCnt $file $imgwidth → $maxwidth"
sips -s format jpeg -Z $maxwidth "$file" --out new/"$file".jpg > /dev/null 2>&1
touch -r "$file" new/"$file".jpg
rm "$file"
fi
fi
done
echo ""
echo "Will replace originals..."
echo "Done!"
rsync -a new/ .
rm -rf new
Если вы решите воспользоваться этим скриптом — сохраните вышеприведённый код в файле resizeImages.sh
, настройте максимальную ширину изображения в пикселях, а потом запустите скрипт из терминала, выполнив команду вида ./resizeImages.sh photos
. Здесь photos
— это имя папки, в которую были скопированы снимки с iPhone. Для сброса снимков с iPhone на компьютер рекомендую пользоваться программой Image Capture.
Как вы подходите к обработке и хранению больших фотографий?
Автор: ru_vds