Подготовка фоток для постов скриптами
[windows
|
imagemagick
|
cmd
|
python
]
Abstract
Пишем скрипты для автоматизированной обработки фоток для постов с помощью ImageMagick, питона, batch cmd и чьей-то матери.
Introduction
Все фотки для постов после отбора и нумерации нужно обработать по однотипной схеме: вертикальные склеить по две и отресайзить, горизонтальные просто отресайзить.
Какое-то время я делал это руками в Paint.Net, но после очередной сессии меня стукнуло: это можно и нужно автоматизировать. Вспомнил, что есть консольная утилита для обработки картинок, нашёл ImageMagick.
Ну и понеслась.
Methods
Сразу скажу, что у меня стоит Python 3.9.1 и ImageMagick 7.1.0-14.
Легко и непринуждённо
У меня два основных сценария: для двух вертикальных фоток и для одной горизонтальной. Начал с простого.
Отресайзить фотку до лимита по длинной стороне, где аргументами являются полные пути к входному и выходному файлам:
magick convert %1 -resize 1000 %2
Кажется, так легко, а мне пришлось пошукать по доке и форумам, чтобы это сообразить.
Начинаются сложности
Идём дальше, сценарий посложнее. Нужно склеить две фотки, да не вплотную, а с определённым расстоянием, а потом отресайзить.
Здесь долго экспериментировал, в итоге пришёл к тому, что надо делать двумя командами через temp-файл, иначе никак.
Сначала склеиваем две фотки с полями 50px и сохраняем в temp. К сожалению, полями можно управлять довольно ограниченно: нельзя добавить только внешние поля, как мне нужно, поля добавляются с двух сторон от каждой фотки, то есть и между фотками (как надо) и снаружи (как не надо).
Tile x1 - режим склеивания, в моём случае горизонтально, в строчку, то есть 2x1.
Geometry - управление размером и полями.
magick montage %extra% %1 %2 -tile x1 -geometry +50+0 "%temp%\temp.jpg"
Вторым проходом удаляем лишние внешние поля (shave) и ресайзим. Временный файл тоже удаляем.
magick convert "%temp%\temp.jpg" -shave 50x0 -resize 1000 %3
del "%temp%\temp.jpg"
Нюансы
Далее начались нюансы.
У фоток с телефона ImageMagick почему-то путал длину и ширину местами. У фоток с фотика, дрона или Paint.Net всё было в порядке.
Пришлось искать, как достать свойства файла, и в зависимости от размеров, поворачивать фотки перед склеиванием.
Выводим длину и ширину (%w %h):
magick identify -ping -format "%w %h" %1
И поворачиваем перед склеиванием:
magick montage -rotate 90 %1 %2 -tile x1 -geometry +50+0 "%temp%\temp.jpg"
Дальше было ещё много работы перед тем, как получился финальный универсальный скрипт.
Автоматизируй это
У меня был готов скрипт для одного файла. Теперь надо было вызвать его для всех.
Мне хватило ебанины с batch cmd, поэтому вторую часть я решил писать на питоне.
Сценарий простой: на входе имя поста (папки), идём по всем файлам из папки с оригиналами фоток, если это пара, вызываем с тремя параметрами, если нет, с двумя.
Скрипт можно посмотреть здесь.
Results
Доволен, как слон: теперь вместо часа подготовка фоток занимает пару минут.
Потестил на разных типах фоток, размерах, источниках, путях (и с пробелами), пока всё работает.