代码之家  ›  专栏  ›  技术社区  ›  DataGreed

有什么方法可以在Python中为图像制作出很好的抗锯齿圆角?

  •  14
  • DataGreed  · 技术社区  · 16 年前

    有没有办法用巨蟒做漂亮的圆角?目前PIL和GD2在我的项目中使用。他们两个都有一个 arc() 方法,这样可以绘制四元圆,但四元圆没有抗锯齿,因此图像看起来很清晰。

    有没有什么干净的方法来制作抗锯齿/平滑的圆角?

    4 回复  |  直到 13 年前
        1
  •  16
  •   Community Mohan Dere    9 年前

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

    边界神经网络

    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 我不久前写了一篇关于更多细节的文章(无耻的插页)

    如果您想要更多的控制大小和半径,那么您需要使用弧或饼。我不知道你的情况,但是我用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

    对我来说,这看起来也够光滑的了。

        2
  •  5
  •   bobince    16 年前

    你必须 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')
    
        3
  •  4
  •   DataGreed    16 年前

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

    我用过采样法 博宾斯 以前有人提议过,但我发现图像变得模糊了。所以,我不会提供完整的代码,但我会解释我的解决方案。

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

    通过pil,你可以在图像上画出白色(或者任何你需要的颜色,包括透明的颜色)的角。然后你复制它。现在,您应该有两个具有清晰的非抗锯齿白色圆角的图像。

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

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

    现在,您必须使脆图像上的角变得透明,并将整个图像粘贴到平滑的图像上。我在PIL库中使用了image.composite(crispy_image,smooth_image,crispy_image)方法。

    喂!

        4
  •  0
  •   Jamie Bertram    13 年前

    使用吴晓林的圆算法,如图形宝石II所述。这里有一个简明的总结和示例(在PHP中)han: http://create.stephan-brumme.com/antialiased-circle/

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