Dat*_*eed 14 python image-processing rounded-corners python-imaging-library
有没有办法用python制作漂亮的圆角?目前我的项目中使用了PIL和GD2.他们两个都有一个arc()方法,允许你绘制一个四分之一圆,但四分之一圈没有抗锯齿,所以图像看起来很脆.
是否有任何简洁的方法来制造抗锯齿/光滑的圆角?
Nad*_*mli 16
我通常做的是使用图像作为掩码,例如:
border.png
替代文字http://nadiana.com/sites/default/files/pil_tutorial/border.png
border = Image.open('border.png')
source = border.convert('RGB')
img.paste(source, mask=border)
Run Code Online (Sandbox Code Playgroud)
可以调整蒙版的大小以适合您想要的尺寸.只需确保使用Image.ANTIALIAS方法.
你可以参考我刚才写的教程了解更多细节(无耻插件)
如果你想要更多地控制尺寸和半径,那么你需要使用弧或pieslice.我不知道你,但我用PIL创建的这个圆角矩形对我来说看起来很顺利:
alt text http://nadiana.com/sites/default/files/round_rectangle.png
这是我用来绘制它的代码
也许你应该检查phatch:http://photobatch.wikidot.com/tutorials 它是用Python和PIL编写的,可以应用圆角到照片.
![]()
以下是用于应用圆角的代码的链接:http://bazaar.launchpad.net/~stani/phatch/trunk/annotate/head : /phatch/actions/round.py
这对我来说也很顺利.
您必须超级采样:将弧绘制为更大的图像并将其缩小.
例如.白色,平滑半透明的右下角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')
Run Code Online (Sandbox Code Playgroud)
所以,好吧,我找到了解决方案。
我使用了bobince之前提出的超采样方法,但我发现图像变得模糊。因此,我不会提供完整的代码,但我会解释我的解决方案。
这可能看起来有点白痴,但我还没有找到任何其他方法来做到这一点而不涉及任何其他库。
使用 PIL,您可以在图像上绘制白色(或任何您需要的颜色,包括透明的颜色)角。然后你复制它。您现在应该有两个带有脆的非抗锯齿白色圆角的图像。
现在您应该使用放大 -> 缩小超级采样(有关详细信息,请参阅上面bobince 的答案)方法使其中一张图像变得平滑(我使用了 8 倍缩放)。
现在您有两张图像 - 一张具有脆角,另一张具有平滑的角,但图片模糊。
现在,您必须使脆图像上的角透明,并将整个图像粘贴到光滑图像上。我使用 PIL 库中的 Image.composite(crispy_image, smooth_image, Crispy_image) 方法来执行此操作。
瞧!