有没有办法在python中为图像制作漂亮的抗锯齿圆角?

时间:2009-12-01 19:32:45

标签: python image-processing python-imaging-library rounded-corners

有没有办法用python制作漂亮的圆角?目前我的项目中使用了PIL和GD2。它们都有一个arc()方法,可以让你绘制一个四分之一圆圈,但四分之一圈不是抗锯齿的,所以图像看起来很脆。

是否有任何简洁的方法来制造抗锯齿/光滑的圆角?

4 个答案:

答案 0 :(得分:16)

我通常做的是使用图像作为掩码,例如:

border.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.ANTIALIAS方法。

你可以参考我前一段时间写的tutorial了解更多细节(无耻插件)

如果您想要更大程度地控制尺寸和半径,则需要使用弧形或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

这对我来说也很顺利。

答案 1 :(得分:5)

您必须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')

答案 2 :(得分:4)

所以,好吧,我找到了解决方案。

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

它可能看起来有点像独白,但在没有涉及任何其他库的情况下我还没有找到任何其他方法。

使用PIL,您可以在图像上绘制白色(或任何需要的颜色,包括透明的颜色)角。然后你复制它。你现在应该有两个图像,带有非抗锯齿的白色圆角。

现在你应该使用放大 - >缩小超级采样(参见 bobince的上面的详细解答)方法,使其中一个图像平滑(我使用8倍缩放)。

现在你有两个图像 - 一个有脆角,另一个有光滑的角落,但图像模糊。

你现在必须使香脆的图像上的角落透明并将整个图像粘贴在光滑的图像上。我在PIL库中使用了Image.composite(crispy_image,smooth_image,crispy_image)方法来执行此操作。

瞧!

答案 3 :(得分:0)

使用图形宝石II中描述的Xiaolin Wu的圆圈算法。这里有一个简明的摘要和示例(在php中):http://create.stephan-brumme.com/antialiased-circle/

对于绘制圆弧(部分圆),您必须在绘制之前确定给定点是否在圆弧的角度范围内。