【问题标题】:how to fill a part of a circle using PIL?如何使用 PIL 填充圆圈的一部分?
【发布时间】:2011-02-27 01:45:03
【问题描述】:

我正在尝试将 PIL 用于一项任务,但结果非常 dirty

我正在做的是尝试填充一个圆圈的一部分,正如您在 image 上看到的那样。

这是我的代码:

def gen_image(values):

    side = 568
    margin = 47
    image = Image.open(settings.MEDIA_ROOT + "/i/promo_circle.jpg")

    draw = ImageDraw.Draw(image)
    draw.ellipse((margin, margin, side-margin, side-margin), outline="white")

    center = side/2
    r = side/2 - margin

    cnt = len(values)

    for n in xrange(cnt):
        angle = n*(360.0/cnt) - 90
        next_angle = (n+1)*(360.0/cnt) - 90
        nr = (r * values[n] / 5)

        max_r = r
        min_r = nr

        for cr in xrange(min_r*10, max_r*10):
            cr = cr/10.0
            draw.arc((side/2-cr, side/2-cr, side/2+cr, side/2+cr), angle, next_angle, fill="white")

    return image

【问题讨论】:

标签: python image python-imaging-library charts


【解决方案1】:

我用PIL已经有一段时间了,但是在其他各种图形库中,绘制圆弧时经常会出现锯齿问题。

您是否尝试过启用抗锯齿功能或使用较粗的线条进行绘图?

[编辑]快速浏览一下 PIL 库,我认为您对线宽等的看法是正确的。

听起来这里最简单的做法是构建一个覆盖每个区域的多边形。所以在每一端都有一对点,然后在中间加载一个负载,以防止边缘看起来参差不齐。这有意义吗?

【讨论】:

  • no.. 我不知道该怎么做。抱歉,我对图像、抗锯齿等知之甚少。我在pythonware.com/library/pil/handbook/image.htm 的 PIL 文档中发现了抗锯齿,但在一些调整大小的功能中,这对我没有用。而且我不知道在哪里设置线宽。 :(
  • hm,aggdraw 模块中有类似线宽的东西,effbot.org/zone/pythondoc-aggdraw.htm。但我真的很想只使用 PIL,因为我不能简单地在服务器上安装我想要的任何库。并且 aggdraw 模块是基于 PIL 的,所以我认为它不会产生更清晰的结果(也许我错了)
  • 嗯,是的,有道理!谢谢,我马上试试。会回忆起所有的三角函数
【解决方案2】:

不要用白色擦除,而是考虑只为您想要显示的区域绘制一个蒙版。这是一个圆形遮罩的示例。

How do I generate circular thumbnails with PIL?

【讨论】:

    【解决方案3】:

    您在单独的图像上绘制一个圆圈,然后通过在该区域上创建一个三角形并将其从图像中删除(使其透明)来删除您不想要的圆圈切片。然后你把这个圆段复制到你想要的图像中。

    如果你想要一个部分环,画一个圆,然后画一个较小的圆从第一个开始切割,然后用放射线做一个三角形,以同样的方式去除你不需要的部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多