如何使用PIL填充圆的一部分?

2 投票
3 回答
1959 浏览
提问于 2025-04-15 23:28

我正在尝试使用PIL(Python图像库)来完成一个任务,但结果看起来非常糟糕

我想做的是填充一个圆的一部分,具体可以在这张图片中看到。

这是我的代码:

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

3 个回答

0

你可以在一张单独的图片上画一个圆,然后通过在不想要的部分上画一个三角形,把那部分去掉(让它变得透明)。接着,把这个圆的一部分复制到你想要放的位置。

如果你想要一个部分的圆环,先画一个大圆,然后再画一个小圆,把小圆的部分从大圆里切掉。然后用放射状的线条画一个三角形,像之前那样去掉你不需要的部分。

1

与其用白色擦除,不如考虑只画出你想显示的区域的遮罩。下面是一个关于圆形遮罩的例子。

我该如何用PIL生成圆形缩略图?

1

我很久没用PIL了,但在其他一些图形库中,画弧的时候常常会遇到锯齿问题。

你有没有试过开启抗锯齿功能,或者用更粗的线条来画呢?

[编辑] 我快速看了一下PIL库,觉得你说的关于线宽的确是对的。

这里最简单的方法就是构建一个多边形,覆盖每个区域。也就是说,在每个端点放一对点,然后在中间加上一些点,这样可以防止边缘看起来很锯齿。这样说你能理解吗?

撰写回答