Есть целый класс задач, которые не настолько важны, чтобы покупать под них отдельный софт, но и не настолько редки, чтобы каждый раз делать всё вручную.
У меня такой задачей оказалась конвертация изображений в WebP.
Периодически для статей, сайтов или проектов мне нужно переводить JPEG, PNG и иногда даже RAW-файлы в WebP. Обычно сценарий выглядит одинаково: открыть какой-нибудь онлайн-конвертер, загрузить файлы, дождаться обработки, скачать результат. Иногда ещё посмотреть рекламу очередного сервиса, который обещает «революцию в работе с изображениями».
Работает. Но раздражает.
В какой-то момент я решил, что хочу делать это локально на Mac в пару кликов. Без браузера, без регистрации и без очередного приложения, которое появляется в системе ради одной функции.
Раньше я бы открыл Google.
Нашёл бы несколько статей, потом документацию cwebp, потом обсуждение на Reddit или Stack Overflow, потом начал бы собирать решение по кускам. Ничего сложного, но времени это всегда съедает больше, чем кажется.
На этот раз я просто открыл ChatGPT.
От идеи до рабочего инструмента
Сначала задача выглядела максимально просто:
«Хочу выделять изображения в Finder и конвертировать их в WebP через Automator».
На этом этапе модель предложила несколько вариантов реализации. Часть из них оказалась неудобной. Один вариант вообще не заработал на моей конфигурации Mac.
Это нормально.
Именно тут мне нравится формат диалога. Не нужно возвращаться в поисковик и искать новую статью. Можно показать ошибку, объяснить ограничения и продолжить двигаться дальше.
Через несколько итераций появился рабочий скрипт.
Причём по дороге задача немного изменилась. Сначала речь шла только про JPEG, потом захотелось поддержку PNG, потом HEIC, а потом я подумал: если уж делать, то почему бы не добавить RAW-файлы с камеры.
Так обычно и выглядит разработка собственных инструментов.
Почему в основе оказался cwebp
Саму конвертацию выполняет утилита cwebp от Google.
Она давно существует, работает быстро и даёт хороший контроль над качеством итогового изображения.
Первое, что делает скрипт — пытается найти установленный cwebp в системе.
if [ -x "/opt/homebrew/bin/cwebp" ]; then
CWEBP="/opt/homebrew/bin/cwebp"
elif [ -x "/usr/local/bin/cwebp" ]; then
CWEBP="/usr/local/bin/cwebp"
else
CWEBP="$(which cwebp 2>/dev/null)"
fiТут нет никакой магии.
На Apple Silicon Homebrew обычно ставит программы в /opt/homebrew/bin, на старых Intel Mac путь чаще выглядит как /usr/local/bin. Если ни один вариант не найден, скрипт пытается определить расположение через which.
Если cwebp отсутствует, работа просто прекращается.
if [ -z "$CWEBP" ] || [ ! -x "$CWEBP" ]; then
exit 1
fiЛучше остановиться сразу, чем получить десяток непонятных ошибок позже.
Самая интересная часть — работа с разными форматами
Дальше начинается логика обработки файлов.
Для JPEG и PNG всё довольно прямолинейно: берём изображение и передаём его в cwebp.
Но тут появилась проблема.
RAW-форматы вроде CR2, NEF, ARW или DNG напрямую конвертировать нельзя. То же касается HEIC и HEIF.
Поэтому для таких файлов я сначала создаю временный PNG через встроенную утилиту macOS sips, а уже потом отправляю его в cwebp.
if [[ "$ext" =~ ^(heic|heif|cr2|nef|arw|rw2|orf|dng)$ ]]; then
TMPPNG="$(mktemp /tmp/XXXXXX.png)"
sips -s format png "$file" --out "$TMPPNG"
"$CWEBP" -q 80 "$TMPPNG" -o "$out"
rm "$TMPPNG"
fiКогда этот кусок заработал, я немного обрадовался.
Потому что из задачи «конвертировать JPEG» внезапно получился инструмент, который умеет работать почти со всеми изображениями, которые обычно встречаются у меня в работе.
Почему скрипт умеет обрабатывать папки
Следующая мысль возникла почти сразу.
Если уж запускать Automator, то почему бы не дать ему папку целиком.
Для этого скрипт проверяет, что именно ему передали: файл или директорию.
Если это папка, он рекурсивно проходит по содержимому через find.
find "$input" -type f \( \
-iname "*.jpg" -o -iname "*.jpeg" \
-o -iname "*.png" \
-o -iname "*.heic" \
-o -iname "*.heif" \
-o -iname "*.cr2" \
-o -iname "*.nef" \
-o -iname "*.arw" \
-o -iname "*.rw2" \
-o -iname "*.orf" \
-o -iname "*.dng" \
\)То есть можно бросить внутрь целую папку с фотографиями после съёмки и получить рядом набор готовых WebP-файлов.
Без ручной обработки каждого изображения.
Что получилось в итоге
В результате у меня появился обычный Quick Action в Automator.
Я выделяю один файл или целую папку в Finder, нажимаю правой кнопкой мыши и запускаю действие. Через несколько секунд рядом появляются готовые WebP-версии.
Никаких сайтов.
Никаких загрузок.
Никаких подписок на сервисы для выполнения операции длительностью примерно пять секунд.
Самое забавное, что итоговый инструмент получился полезнее, чем исходная задача.
Почему для меня это важнее самого скрипта
Если посмотреть на эту историю со стороны, речь вообще не про WebP.
И даже не про Automator.
Речь про то, что раньше между идеей и реализацией почти всегда стояла фаза поиска. Нужно было искать статьи, форумы, документацию, сравнивать решения, собирать их вместе и надеяться, что всё заработает.
Теперь между идеей и реализацией всё чаще появляется диалог.
Можно обсуждать варианты, уточнять требования, получать код, исправлять ошибки и постепенно превращать абстрактную задачу в работающий инструмент.
И мне кажется, это одна из самых недооценённых возможностей современных языковых моделей.
Не потому что они знают ответы на все вопросы.
А потому что они позволяют гораздо чаще проверять мысль: «Интересно, а можно ли сделать это по-другому?»
В эпоху ИИ любознательность начинает приносить всё больше дивидендов. Очень многие привычные действия всё ещё делаются по инерции — просто потому, что мы привыкли именно так. И чем чаще задаёшь себе вопрос про альтернативный способ решения задачи, тем чаще оказывается, что между «было бы удобно» и «уже работает» теперь расстояние всего в один разговор.
