redmanmale

if-goto

Подготовка фоток для постов скриптами

[ 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

Доволен, как слон: теперь вместо часа подготовка фоток занимает пару минут.
Потестил на разных типах фоток, размерах, источниках, путях (и с пробелами), пока всё работает.