Python 使用pyCairo填充具有多个孔的多边形

Python 使用pyCairo填充具有多个孔的多边形,python,python-3.x,svg,polygons,pycairo,Python,Python 3.x,Svg,Polygons,Pycairo,我没有尝试用pyCairo填充多边形,但我希望某些区域未填充。例如,我想制作如下内容: 灰色背景是SVG查看器的背景,因此表示图像的透明部分 我尝试使用以下代码: import cairo cairo.FILL_RULE_EVEN_ODD svg_file_pointer = open('CairoPoly.svg', 'wb') shape_container = cairo.SVGSurface(svg_file_pointer, 500, 500) shape_description

我没有尝试用
pyCairo
填充多边形,但我希望某些区域未填充。例如,我想制作如下内容:

灰色背景是SVG查看器的背景,因此表示图像的透明部分

我尝试使用以下代码:

import cairo

cairo.FILL_RULE_EVEN_ODD
svg_file_pointer = open('CairoPoly.svg', 'wb')
shape_container = cairo.SVGSurface(svg_file_pointer, 500, 500)
shape_description = cairo.Context(shape_container)
shape_description.rectangle(0, 0, 500, 500)
shape_description.clip_preserve()
shape_description.stroke()

shape_description.set_line_width(1)
shape_description.set_source_rgb(20/51, 0, 0)
for r in ((100, 100, 400, 400), (200, 200, 350, 300), (150, 110, 190, 390)):
    shape_description.move_to(r[0], r[1])
    shape_description.line_to(r[0], r[3])
    shape_description.line_to(r[2], r[3])
    shape_description.line_to(r[2], r[1])
    shape_description.line_to(r[0], r[1])
shape_description.close_path()
shape_description.fill()
shape_container.finish()
svg_file_pointer.close()
del shape_container

但它不起作用。这可以用pyCairo实现吗?如果可以,如何实现?

要获得带孔的多边形,需要定义轮廓。轮廓必须是单笔画。部分重叠的边缘将导致问题。我的建议是:太难做到正确

我看到两种解决办法:

  • 将形状切割成可以填充的矩形,只需省略“透明”部分
  • 将外部矩形渲染为新的(屏幕外)图像。使用透明颜色绘制孔。然后将此图像与其他图像叠加

  • 注意:有些二维库可以与矩形相交。如果您有一个(Cairo中甚至可能有一个),那么您可以让库通过对外部矩形应用布尔运算来计算所需的矩形列表(从中添加和删除矩形以获得矩形列表)。

    我不熟悉pyCairo,但是从SVG的角度来看,您所做的基本思想是正确的。你很接近,但不完全正确

    您要做的是为每个矩形创建一个带有子路径的路径


    非常感谢。原来问题是我不知道如何处理cairo.FILL\u RULE\u偶数。在我的例子中,我简单地用
    shape\u description.set\u fill\u rule(cairo.fill\u rule\u偶数)
    替换它,现在它就像一个符咒一样工作。