Конвертируем мультистраничный .ps файл в анимированный .gif
Задача: Есть многостраничный .ps файл, нужно сделать из него анимированный .gif, предварительно подрезав каждую страничку.
?нструменты: Python, утилита convert из пакета imagemagick
Под катом простые скрипты, позволяющие собрать картинки в .gif в прямом и обратном порядке.
Как обычно буду рад, если в комментариях оставите свои улучшенные версии скрипта, не обязательно на питоне 🙂
Сначала скрипт:
#to numbers with leading zeros
#
# input - filename, number of pages
import os, sys
try:
input_file = sys.argv[1]; number_of_frames = sys.argv[2]
except:
print "Usage:",sys.argv[0], "infile number_of_frames"
sys.exit(1)
os.system("convert -density 70 -crop 540x610+30+55! "+input_file+" "+input_file[:-3]+".png")
for i in range(int(number_of_frames)):
os.system("mv "+input_file[:-3]+"-"+str(i)+".png "
+input_file[:-3]+"-"+str(i).zfill(5)+".png")
os.system("convert -delay 100 *.png "+input_file[:-3]+".gif")
Вызывается он следующим образом:
где 74 это количество страниц вашем .ps файле.
?значально в .ps странички выглядят как-то так:
После получения имени файла и количества страниц мы используем команду convert для того чтобы, перевести файлы из .ps в .png.
- —density — разрешение растровой картинки получающейся из векторной, в DPI
- —crop — обрезает картинку, поскольку весь лист нам не нужен, а необходима только содержательная часть.
в итоге получаем 74 .png файла, уже обрезанных по размерам:
? всё бы хорошо, но нумерует convert по порядку без нулей впереди, и как это изменить, я не нашёл. В результате картина следующая
Хочется, чтобы файлы были по порядку, иначе конвертация в gif будет связана с дополнительным геморроем. Для этого делаем небольшой цикл:
os.system("mv "+input_file[:-3]+"-"+str(i)+".png "+
input_file[:-3]+"-"+str(i).zfill(5)+".png")
где всё понятно кроме, может быть str(i).zfill(5) . Метод zfill добавляет нули слева от строковой переменной так, чтобы она заполняла поле определённой ширины. Это позволяет вам не страдать изобретением велосипеда, как это делал я вот тут. В результате у нас наводится порядок в именах файлов:
Теперь без проблем конвертируем все png файлы в анимированный .gif
Задержка между кадрами -delay, похоже измеряется в тактах в секунду, подбирается опытным путём на вкус 🙂
Для моих целей необходимо, чтобы картинки демонстрировались в обратном порядке, для этого мы вместе с добавлением нулей поменяем нумерацию на обратную. Это можно реализовать заменив наш цикл на:
os.system("mv "+input_file[:-3]+"-"+str(i)+".png "
+input_file[:-3]+"-"+str(int(number_of_frames)-i).zfill(5)+".png")
В результате может получиться такой gif (картинку уменьшил, дабы избежать совсем уж неприличных для веба размеров ) )
Я думаю, можно было обойтись без переименования файлов. Что-нибудь вроде convert `ls -v *.png` расставило бы кадры в нужном порядке (если в именах нет пробелов). `ls -vr` при этом изменило бы порядок кадров на обратный.
Да, для создания анимированных гифов есть ещё gifsicle, которые ещё и оптимизирует gif. Результат gifsicle с результатом convert я не сравнивал, но, возможно, имеет смысл сравнить.
2jetxee
Да, ты абсолютно прав, ls -v *.png сортирует файлы по порядку. Причем из описания я так и не уразумел как конкретно она это делает 🙂 . При этом мне не удалось сконструировать пайп, который бы последовательно передовал список файлов из ls -v *.png в convert. Есть идеи по этому поводу? 🙂
ls -v сортирует правильно, потому что пытается интерпретировать встречающиеся последовательности цифр как числа.
?дея — не передавать список файлов пайпом, а вставить его прямо в коммандную строку (обратные апострофы подставляют стандартный вывод команды). Если в папке ничего кроме нужных PNGов нет и в их именах нет пробелов, то
должно сработать.
Да, первый этап, конвертация страниц в отдельные растровые файлы, можно было сделать тоже прямо из командной строки:
$ pdftoppm file.pdf page
$ mogrify -crop -resize page*.ppm
и получить набор обрезанных страниц в виде page-000001.ppm. Создав анимацию тоже из командной строки:
Весь скриптps2gif на bash в 17 строк, считая начальную shebang, справку, проверку параметров кропа и удаление временных файлов, если всё прошло ОК:
# convert Postscript to animaged GIF
usage="`basename $0` input.ps crop-geometry delay output.gif"
if [ $# -ne 4 ] ; then
echo $usage ;
exit 1 ;
fi
f="$1" ; crop="$2" ; delay="$3" ; gif="$4";
if [ "x$(echo $crop | tr -d '0-9x%')" == "x" ] ; then # +x+y not specified
echo $usage ;
echo crop-geometry format: WxH+x+y ;
exit 2 ;
fi
ps2pdf "$f" && \
pdftoppm "${f%.ps}.pdf" page-$$ && \
mogrify -crop "$crop" page-$$-*.ppm && \
convert -delay "$delay" page-$$-*.ppm "$gif" && \
rm page-$$-*.ppm "${f%.ps}.pdf"
Блог проявил излишнюю самостоятельность, спрятав <, > и знаки плюс. В общем, скрипт пожно в pastebin посмотреть, http://pastebin.com/f3d50952
2jetxee
Спасибо, что смог поправил. Вечером из дома посмотрю на сам скрипт 🙂
2jetxee
Шайтан, весь цикл одной строчкой заменил!
Работает, однако!
За этот приемчик большое спасибо! )
2jetxee
Да, всё работает ) правда геометрию кропа пришлось заново подбирать )
2jetxee
Да, всё работает ) правда геометрию кропа пришлось заново подбирать )
Не меняя геометрию, не меняя название файлов — все работает замечательно. Спасибо, раньше даже не задумывался, что можно такие вещи делать…
Чтобы не задавать определённую геометрию «нового» изображения, можно вместо опции -crop использовать -trim, тогда при конвертации все пустые белые поля на краях изображения будут убраны автоматом. ? есть ещё «mogrify», хорошее дополнение к convert, если нет нужды хранить оригинальные .ps изображения.
PS. Наверное пинглем записываешь .ps файлы? Можно ещё практически с тем же качеством сразу создавать .png, указав в resources опцию «wkWidth», и задав нужный размер в пикселях, вроде вот так:
[code]
resources.wkWidth = 1600
resources.wkHeight = 1600
[/code]
Всё отлично работает, спасиб, правда с геометрией запарился
Действительно работает))
Like!! I blog quite often and I genuinely thank you for your information. The article has truly peaked my interest.
Cephalexin And Augmentin Cialis Propecia Tiempo generic cialis When Would Amoxicillin Not Be Effective
Keflex Drug Interactions can i buy cialis online Natural Equivalent To Amoxicillin Cialis Toronto Drug Store