【问题标题】:Any way to make nice antialiased round corners for images in python?有什么方法可以为 python 中的图像制作漂亮的抗锯齿圆角?
【发布时间】:2020-12-01 21:44:47
【问题描述】:

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

是否有任何巧妙的方法可以制作抗锯齿/平滑圆角?

【问题讨论】:

  • 你能举一个你得到的角落的例子吗?顺便说一下,我在答案中添加了更多细节。
  • 与您回答中的黄色矩形相同:) 不幸的是,它们在照片上看起来很丑。在底部检查我的答案。并感谢您的帮助。

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


【解决方案1】:

我通常做的是使用图像作为蒙版,例如这个:

边框.png

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

可以调整蒙版的大小以适合您想要的尺寸。只需确保使用 Image.ANTIALIAS 方法即可。

你可以参考我前段时间写的tutorial了解更多详情(无耻塞)

如果您想更好地控制大小和半径,则需要使用弧形或 pieslice。我不了解你,但我用 PIL 创建的这个圆角矩形对我来说看起来很平滑:

这里是the code我以前画的

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

这里是用于应用圆角的代码的链接: http://bazaar.launchpad.net/~stani/phatch/trunk/annotate/head:/phatch/actions/round.py

这对我来说也足够流畅。

【讨论】:

  • 白色背景上的黄色矩形——不是最容易看出它是否平滑的颜色。
  • 感谢您在圆角上复制的想法。是的,我需要控制大小和半径,这些角对我来说看起来并不平滑,因为我将它们应用于照片。
  • 我在答案中添加了更多细节
  • 哇,thanx for phatch - 我去看看。
  • 两张图片以及教程和代码的链接已失效。请问你能更新答案吗?
【解决方案2】:

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

【讨论】:

  • 这就是我现在使用的,但是这种方法使修改后的图像看起来模糊:(
  • 我在照片上加了角,照片看起来应该像以前那样 + 圆角平滑
  • 好的,然后交换上面的透明圆(所以你将透明白色 (255,255,255,0) 绘制到不透明白色 (255,255,255,255) 上。现在你有一个角模板。你可以得到照片并使用photoim.paste(cornerim, position, cornerim)将白色角模板放在照片右下角的顶部。用transpose()翻转模板并为每个角重新做一次。(如果你需要制作输出透明需要更多的工作,您必须制作一个与照片大小相同的单独完整蒙版图像,然后将照片和蒙版粘贴在一起。)
  • 不错的解决方案,虽然我需要透明的角落 :) 不过还是谢谢你
【解决方案3】:

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

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

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

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

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

现在您有两张图片 - 一张边角酥脆,另一张边角平滑,但图片模糊。

您现在必须使清晰图像上的角透明并将整个图像粘贴到平滑图像上。我使用 PIL 库中的 Image.composite(crispy_image, smooth_image, crispy_image) 方法来做到这一点。

瞧!

【讨论】:

  • 一个可能的改进:使用超采样灰度蒙版。在那里你画一个白色的图像,然后你可以缩小它,即使用 BICUBIC 插值。这应该为您提供带有灰色像素的圆角。粘贴此蒙版应该也会在最终图像中为您提供平滑的角落。
【解决方案4】:

使用Graphics Gems II 中描述的Xiaolin Wu 的圆算法。简明扼要的总结和示例(在 php 中)可以在这里找到:http://create.stephan-brumme.com/antialiased-circle/

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多