
Наверняка многим приходилось сталкиваться с обработкой больших массивов изображений. Поменять формат, уменьшить размер и т. д. Естественно руками всё это делать слишком долго. Так случилось, что передо мной легла задача конвертировать около 12000 изображений из TIFF в PNG, поскольку файлы в ближайшее время необходимо было выложить для просмотра на сайте, а пытки google не дали готовых результатов.
Естественно ручной вариант отбрасывался сразу. В поисках решения были также отклонены платные программы с графическим интерфейсом. Осложняло задачу и то, что сканы эти валялись в перемешку с CSV и многими другими файлами. В результате я решил пользоваться стандартной в моей Ubuntu 10.04 утилитой convert и за полчаса был набросан следующий скрипт:
find -name "*.tif" | while read f; do convert "$f" "${f%.*}.png"; rm -f "$f"; done
Который, выполняясь в необходимой директории, конвертировал все нужные файлы, в том числе и в подкаталогах, в png и удалял исходные TIF'ы. Довольный собой, сказал об этом начальнику и узнал… что сервер с изображениями крутится под Windows Server 2003.
Несколько обескураженный (сижу под линуксами с 15 лет) начал вспоминать как в колледже на первом курсе нас учили писать батники и искать аналогичную утилиту под Windows. Первое что мне попалось — тот же самый, но уже виндовый ImageMagick'овский convert напрочь отказывался работать с TIF — утверждал, что файл невозможно открыть, ругался на BLOB'ы, а времени на разбирательства не было. Следующим оказалась утилита GraphicsMagick. Из-за схожести названия сперва полагал, что будет происходить та же самая ошибка — однако же всё заработало прекрасным образом. За некоторое время написал и команду, производящую те же самые действия, что и предыдущий скрипт, но уже под Windows:
for /r %1 in (*.tif) do gm convert ^"%~dpnx1^" ^"%~dpn1.png^" & erase /f /q ^"%1^"
Вообще GraphicsMagick, как и ImageMagick работает со многими форматами (по ссылке кстати неплохое руководство по использованию), в скриптах достаточно поменять tif на формат уже имеющихся изображений, а png на необходимый.