有什么方法可以在Python中为图像制作平滑的圆角吗?

15 投票
4 回答
12530 浏览
提问于 2025-04-15 16:34

有没有什么方法可以用Python做出好看的圆角呢?我现在在我的项目中使用PIL和GD2这两个库。它们都有一个叫做arc()的方法,可以画出四分之一的圆,但这个四分之一的圆没有平滑处理,所以图像看起来很生硬。

有没有什么好的办法可以让圆角看起来更平滑呢?

4 个回答

5

你需要进行一种叫做“超采样”的处理:先把图形画得大一些,然后再缩小到你想要的大小。

比如说,想要画一个白色、边角平滑、半透明的16x16像素的边框,使用4x4的超采样方法:

>>> import Image, ImageDraw
>>> im= Image.new('RGBA', (16*4, 16*4), (255, 255, 255, 0))
>>> dr= ImageDraw.ImageDraw(im)
>>> dr.pieslice((-64, -64, 64, 64), 0, 340, fill=(255,255,255,255))
>>> im= im.resize((16, 16), Image.ANTIALIAS)
>>> im.save('border-se.png')
16

我通常会用一张图片作为遮罩,比如下面这个:

border.png

alt text

border = Image.open('border.png')
source = border.convert('RGB')
img.paste(source, mask=border)

这个遮罩可以调整大小,以适应你想要的尺寸。只要记得使用 Image.ANTIALIAS 方法,这样效果会更好。

你可以参考我之前写的教程,里面有更多细节(嘿嘿,顺便宣传一下)

如果你想更好地控制大小和圆角的半径,那就需要用 arc 或 pieslice。我不知道你怎么想,但我用 PIL 创建的这个圆角矩形看起来挺顺滑的:

alt text

这是我用来绘制它的代码

也许你可以看看 phatch:http://photobatch.wikidot.com/tutorials。它是用 Python 和 PIL 写的,可以给照片加圆角。

alt text

这里有一个链接,里面是用来加圆角的代码: http://bazaar.launchpad.net/~stani/phatch/trunk/annotate/head:/phatch/actions/round.py

我觉得效果也挺顺滑的。

4

好的,我找到了一个解决办法。

我用了之前bobince提到的超采样方法,但发现图片变得模糊了。所以我不打算提供完整的代码,而是来解释一下我的解决方案。

这可能听起来有点傻,但我没有找到其他不需要用到其他库的方法。

用PIL库,你可以在图片的角落画上白色(或者你需要的任何颜色,包括透明的)角落。然后你复制这张图片。现在你应该有两张图片,一张是清晰的、没有抗锯齿效果的白色圆角。

接下来,你要用放大再缩小的超采样方法(具体细节可以参考bobince的回答)来让其中一张图片变得平滑(我用了8倍放大)。

现在你有两张图片——一张有清晰的角落,另一张角落平滑但图片模糊。

接下来,你需要把清晰图片的角落变成透明,然后把整张图片贴到平滑的那张上。我用了PIL库里的Image.composite(crispy_image, smooth_image, crispy_image)方法来实现这个。

完成了!

撰写回答