Я понял это сейчас.Таким образом, нет никакого способа сделать это - все API 2D-рисования в стиле Каира предполагают, что «заливка» включает границу.Он работает таким образом на большинстве бэкэндов, к которым рендерится Cairo, например Postscript и SVG, поэтому трудно представить, как они могут отличаться.
«Чистый» способ сделать это - выполнить итерации по полигону так, чтобывы генерируете точки, которые разграничивают только область, которую вы хотите заполнить, т.е. вы должны сами рассчитать площадь линии.
Ваш хак, с другой стороны, кажется умным, невозможно сделать это полностью в Каире, поскольку он имеет дело с растром.Но вместо сохранения на диск и перезагрузки вы можете воспользоваться другими способами - например, вы можете использовать данные поверхности Cairo в качестве поверхности SDL в Pygame для имитации операций «копировать и вставить».
http://doswa.com/blog/2010/03/29/using-cairo-in-pygame/ http://www.pygame.org/wiki/CairoPygame
(На самом деле, я пытался придумать рабочий процесс с использованием Pyagame и не смог - возможности манипулирования альфа-пикселями и копирования / вставки на нем довольно ограничены).
Последнее предложение для вас: не используйте для этого pycairo - проверьте, подходит ли вам использование GIMP Python API.GIMP - это полнофункциональная программа для рисования 2D с полным API, которую можно использовать из Python.Вы можете рисовать свои полигоны с помощью объектов GIMP «Векторы», и хотя «заливка» также будет включать в себя линию многоугольника, есть «gimp_selection_shrink», которую вы можете вызвать, например, jsut перед заполнением.Или вы можете использовать слои, чтобы получить нужный эффект.
Внутри GIMP вы можете проверить весь API в меню Справка-> Процедура.
Как только ваш скриптготово, можно запускать GIMP со строкой coomand для запуска вашей программы, без необходимости графического отображения.
Вот рабочий процесс, который вам необходим с помощью pygimp:
- СоздатьОбъекты векторов GIMP с вашими полигонными точками: pdb.gimp_image_add_vectors, pdb.gimp_vectors_stroke_new_from_points
- Создайте новый слой (над слоем с изображением, которое вы хотите сохранить вдоль линии) pdb.gimp_layer_new (есть некоторые другие функции, которыедолжны быть вызваны для привязки слоя к изображению)
- Преобразование полигона в выделение - pdb.gimp_vectors_to_selection
- Заполните новый слой нужным цветом pdb.gimp_edit_bucket_fill
- Преобразовать выделение в "толстое" выделение с помощью pdb.gimp_selection_border
- Вырезать пиксели из слоя - pdb.gimp_Edit_cut
- Объединить новый слой с вашим предыдущим изображением - pdb.gimp_image_merge_down