【问题标题】:Cairo (w/ Python): Is it possible to fill a Polygon with a transparent line?Cairo(使用 Python):是否可以用透明线填充多边形?
【发布时间】:2011-03-23 02:12:12
【问题描述】:

这是我现在使用的代码:

surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, *image.size)
context = cairo.Context(surface)
context.set_source_rgba(1, 1, 1, 1)
context.new_path()
for i in xrange(len(points)):
    context.line_to(*points[i])

context.close_path()
context.fill()

问题是它用我绘制的相同颜色填充多边形。我尝试在这个多边形上绘制一个新的多边形并只做context.stroke() 而不是fill() 但这只有在我使用不同的颜色时才有效,否则白色会低于。我尝试使用(0,0,0,0),所以它会是透明的,但是下面是白色的。

我可以画一条彩色线(比如(0.5,0.5,0.5,1)),用write_to_png 将它保存到一个图像中,用PIL 加载它,转换为一个numpy.array 并用正确的颜色替换每个像素与背景颜色@ 987654327@ 但效率不高。

我也尝试将线宽设置为 0,但这也不起作用。

另外,我可以使用其他方法让我做到这一点,而不是开罗。我试过 ImageDraw 的 polygon 但它没有画出确切的形状(我不知道如何解释,但它在不应该的多边形之外画了一些额外的像素),所以 ImageDraw 不会帮不了我。

【问题讨论】:

  • 我无法完全理解您想要什么。一个人不会用“线”“填充”一个形状——你想做什么?如果您只想要多边形的轮廓,请尝试使用“.stroke()”而不是“.fill()”。如果您希望绘图颜色透明,请使用 Alpha 的中间值(颜色的第 4 个分量 - 您始终将其设置为 1)
  • 当我使用填充时,它会在多边形上绘制轮廓。我不想要那个轮廓/线。

标签: python image drawing cairo


【解决方案1】:
fill_preserve()
context.set_source_rgba(0, .6, 1, .7) #line color
context.set_line_width(2.35)
context.stroke()

【讨论】:

    【解决方案2】:

    我现在明白了。所以,没有办法做到这一点 - 所有开罗风格的 2D 绘图 API 都假定“填充”包括边框。它在 Cairo 渲染到的大多数后端(如 Postscript 和 SVG)上都以这种方式工作,因此很难想象它会有什么不同。

    “干净”的方法是遍历多边形,以便生成仅划定您想要填充的区域的点 - 即,您必须自己计算线区域。

    另一方面,您的 hack 似乎很聪明,因为它处理的是光栅,所以不可能完全在开罗完成。但是,除了保存到磁盘并重新加载之外,您还可以采取其他方式 - 例如,您可以使用 Cairo 表面数据作为 Pygame 中的 SDL 表面来伪造“复制和粘贴”操作。

    http://doswa.com/blog/2010/03/29/using-cairo-in-pygame/ http://www.pygame.org/wiki/CairoPygame

    (实际上,。我试图考虑使用 Pyagame 的工作流程但不能 - 选项 用于操作 alpha 像素并在其上复制/粘贴是相当有限的)。

    我对你的最后建议:不要为此使用 pycairo - 检查使用 GIMP Python API 是否适合您。 GIMP 是一个功能齐全的 2D 绘图程序,具有可以从 Python 使用的完整 API。您可以使用 GIMP“矢量”对象绘制你的多边形,尽管“填充” 还会包括多边形线,有一个“gimp_selection_shrink”你可以 例如,在填充之前调用 jsut。或者,您可以使用图层来获得您想要的确切效果。

    在 GIMP 内部,您可以在 Help->Procedure 数据库菜单中检查整个 API。

    一旦您的脚本准备就绪,就可以使用命令行运行 GIMP 来运行您的程序,而无需图形显示。

    这是您使用 pygimp 所需的工作流程:

    • 使用您的 poligon 点创建 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 2016-08-25
      • 1970-01-01
      相关资源
      最近更新 更多