如何在Python中为图像制作平滑的圆角?

2024-06-11 13:51:24 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法用python做漂亮的圆角呢?目前在我的项目中使用了PIL和GD2。它们都有一个arc()方法,可以绘制一个四分圆,但是四分圆没有反锯齿,因此图像看起来很清晰。

有没有什么简单的方法可以使抗锯齿/平滑的圆角?


Tags: 项目方法图像pil绘制圆角办法arc
3条回答

所以,好吧,我找到了解决办法。

我使用了之前提出的超采样方法,但是我发现图像变得模糊。所以,我不会提供完整的代码,但我会解释我的解决方案。

这可能看起来有点白痴,但我没有找到任何其他方法来做到这一点,而不涉及任何其他图书馆。

使用PIL,你可以在图像上画出白色(或任何你需要的颜色,包括透明的)角。然后你复制它。你现在应该有两个清晰的无反锯齿白色圆角图像。

现在您应该使用放大-缩小超级采样(有关详细信息,请参见上面的bobince答案)方法来使其中一个图像平滑(我使用了8倍缩放)。

现在你有了两个图像-一个有脆角,另一个有平滑角,但图像模糊。

你现在必须使脆图像的角透明,并将整个图像粘贴到平滑的图像上。我使用了PIL库中的Image.composite(crispy_Image,smooth_Image,crispy_Image)方法来完成这项工作。

喂!

你必须supersample:把弧线画成一个更大的图像并缩小它。

例如,一个白色、平滑的半透明右下16x16边框,带有4x4x正方形超级采样:

>>> 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')

我通常使用图像作为遮罩,例如:

边框.png

alt text http://nadiana.com/sites/default/files/pil_tutorial/border.png

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

可以调整遮罩的大小以适应所需的尺寸。只需确保使用Image.antialas方法。

你可以参考我不久前写的tutorial了解更多细节(无耻的插件)

如果你想对大小和半径有更多的控制,那么你需要使用arc或pieslice。我不知道你的情况,但我用PIL创建的这个圆角矩形看起来足够平滑:

alt text http://nadiana.com/sites/default/files/round_rectangle.png

这是我用来画的the code

也许你应该检查一下phatch:http://photobatch.wikidot.com/tutorials它是用Python和PIL编写的,可以对照片应用圆角。

alt text

以下链接指向用于应用圆角的代码: http://bazaar.launchpad.net/~stani/phatch/trunk/annotate/head:/phatch/actions/round.py

在我看来也很光滑。

相关问题 更多 >