20081209

Пример рисования в PyCairo

Пробуя библиотеку для рисования Cairo из Python, сделал такую вот табличку:



У кого браузер не поддерживает SVG, сморим PNG.

Идею нарисовать временную шкалу использования языков программирования дал мне вот этот опрос на StackOverflow («В каком возрасте вы начали программировать?»).

Кто хочет себе такую же табличку (в смысле, аналогичную), скрипт к вашим услугам (Public Domain). Требует PyCairo (python-cairo).

Оказалось, рисовать из Python в Cairo очень просто. При этом можно получать изображения в векторном формате (PDF, PostScript, SVG), не говоря уже о PNG. Можно будет использовать в будущем для автоматизированного создания схем и графиков, если готовых программ вдруг не хватит.

Есть самоучитель Cairo Tutorial (тоже на примере Python). Если очень кратко, то это делается так:

Шаг 1. Импортируем модуль:
import cairo

Шаг 2. Создаём «поверхность» и берём из неё «контекст» для рисования. Я рисовал сразу в SVG файл:
svg=cairo.SVGSurface("имяфайла.svg",ширина_в_пунктах,высота_в_пунктах)
ctx=cairo.Context(svg)

Шаг 3. Рисуем, используя контекст:
ctx.set_line_width(ширина_линии) # выбираем линию
ctx.set_source_rgba(красный,зелёный,синий,прозрачность) # выбираем цвет
ctx.move_to(x,y) # перемещаем «курсор»
ctx.line_to(x2,y2) # рисуем линию от позиции «курсора» до x2,y2
ctx.arc(x,y,радиус,угол1,угол2) # рисуем дугу с центром в (x,y)
ctx.close_path() # замыкаем контур
ctx.fill() # заливаем контур выбранным цветом
ctx.stroke() # обводим контур выбранной линией
ctx.set_font_size(размер_шрифта) # выбираем размер шрифта, можно дробный
ctx.show_text("буквы") # пишем слово «буквы»

Шаг 4. Нарисовавшись всласть, сохраняем результат (закрываем «поверхность»):
svg.finish()
В качестве справки используем документацию по Cairo для языка Си. Изменения для Python-скриптов вполне очевидны: вместо передачи параметров cairo_t *cr используем методы объекта-контекста. Аналогично для поверхностей.