- Перевод
Мы отлично провели время. А когда вернулись домой и я сбросил на компьютер фотографии, которые снял в путешествии, я обратил внимание на то, что они занимают страшно много места. Я — вовсе не фотограф, хотя мне и очень нравится делать снимки, главная цель которых — сохранить память о чём-то хорошем.
Один из снимков меня прямо-таки зацепил. Это была 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.
Как вы подходите к обработке и хранению больших фотографий?
- Теги:

v1000
сегодня в 12:36
И что в итоге? 3 Мб вместо 10 Мб?
Не удивлюсь, если раньше люди думали «не буду снимать на цветную пленку, хватит и черно-белой. Тем более она дешевле», а теперь их потомки натравливают на эти фото ИИ чтобы раскрасить.
wormball
сегодня в 13:05
Двадцать первый век, 4-терабайтные винчестеры по 100 долларов, а человеку настолько жалко потратить 10 мегабайт на запавший в душу снимок, что он ажно программу для пережатия написал. Так на винчестер поместится не 400 тысяч фотографий, а целый миллион! Вдруг у меня будет миллион любимых фотографий, но не будет лишних 100 долларов на ещё один винчестер? «Tech Entrepreneur | Advisor | Consultant Over a decade of mobile experience at your service. I help business owners navigate and leverage technology.» ну никак не может позволить себе потратить лишние 100 у. е. на какие-то там картинки.
И коли уж так сурово жаба душит, то что мешало в настройках айфона выставить меньшее разрешение?
nixtonixto
сегодня в 13:34
2. Фотографии должны быть не только на винчестере, но и на телефоне, чтобы в любой момент можно было вернуться к ним. А там с терабайтами не всё так просто.
3. У телефона далеки от идеала алгоритмы сжатия, поэтому всегда снимаю в максимальном качестве и потом уменьшаю, если надо. Да и потом можно забыть, что выставил мЕньшее разрешение, и наснимать ценных кадров в уменьшенном разрешении.
Не знаю как на Мак, а на Вин уже лет 10 пользуюсь XnView, там и пакетная обработка с фильтрами, и возможность сочетанием клавиш прямо при просмотре поворачивать фотографии без перекодировки.
krote
сегодня в 13:41
wormball
сегодня в 16:33
SuAlUr
сегодня в 16:50
wormball
сегодня в 13:12
> One picture in particular caught my attention: a goat.
То бишь привлёк внимание. А в переводе читается так, как будто этот несчастный снимок так покорил сердце автора, что он ну никак не может выделить ему лишние 10 мегабайт места на диске.
krote
сегодня в 13:42
Mes
сегодня в 14:52
Да куча софта это умеют делать. Не понимаю, зачем писать свой прекрасный скрипт.
1delovoj1
сегодня в 14:11
Нет конечно статью то надо слепить, пусть даже из фото козы
Голосую за XnView.
Kisa_ua
сегодня в 15:28
За умение пользоваться гуглом твердая двойка)).
XnView, IrfanView и думаю еще многие другие умеют пакетно переживать фото
maxzh83
сегодня в 16:34
av0000
сегодня в 16:49
Не всё устраивает в качестве фотоархива, но умеет писать и читать теги из JPEG(exif)/XMP, хранить в своей базе _или_ записывать их в файлы. Какую-то часть РАВ-ов читает сам, но меньше, чем хотелось.
Организация фото по: тегам, событиям («типа группа»), датам, каталогам на диске, оценкам и «меткам». Теги может писать/читать в файлы, остальное — на уровне БД (оценками не пользуюсь, мож и их пишет)
Можно запускать с разными конфигами — типа «архив с телефона» и «архив фото-любимого-клуба». Есть минимальная правка по яркости-цветности и кучка плагинов (не пользуюсь, не знаю как оно) для экспорта в соцсети и прочие внешние хранилища
maxzh83
сегодня в 16:56
T_Cirkla
сегодня в 18:09
aNNiMON
сегодня в 17:26
Бесплатная XnView MP может читать теги из фотографий и записывать в IPTC/XMP. Только надо в настройках это включить на вкладке Metadata. Теги там зовутся Categories, можно как фильтровать по ним, так и назначать. Есть два режима — либо галочками проставлять теги из списка, либо в Category Sets самому раскидать как удобно (например Животные: коза, собака, кошка. Время суток: утро, день, ночь).
Под Android можно вбить в поиск «IPTC tagger» и выбрать что-то из выдачи. Там немного, но есть.
T_Cirkla
сегодня в 17:35
T_Cirkla
сегодня в 17:53
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.