Python中的IOS角平滑

问题描述 投票:0回答:1

我正在做一个涉及视频帧操作的项目,需求之一是为帧添加平滑的圆角。我对如何使用 PIL 或任何其他图像处理库向图像添加圆角进行了一些研究,但它们都会产生看起来不专业的粗糙角。 这是我尝试过的代码:-

def add_corners(im, rad):
    circle = Image.new('L', (rad * 2, rad * 2), 0)
    draw = ImageDraw.Draw(circle)
    draw.ellipse((0, 0, rad * 2 - 1, rad * 2 - 1), fill=255)
    alpha = Image.new('L', im.size, 255)
    w, h = im.size
    alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0))
    alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad))
    alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0))
    alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad))
    im.putalpha(alpha)
    return im

im = Image.open('sand.png')
im = round_corner_jpg(im, 50)
im.save('sand_corner.png')

这是它产生的结果,如上图所示,角很粗糙并且有像素化视图,它们并不光滑,就像我们在Figma中使用IOS角平滑所做的那样:-

我也看到了这个问题,也有相同的要求,但他们没有显示如何实现它的代码:- 有什么方法可以在 python 中为图像制作漂亮的抗锯齿圆角吗?

我想确保在添加圆角时不会损失框架质量,并且拐角应该光滑且更好,但看起来像figma中的拐角平滑

python ios python-imaging-library drawing rounded-corners
1个回答
0
投票

也许这样更好:

#!/usr/bin/env python3

from PIL import Image, ImageDraw

# Open image
im = Image.open('rock.jpg')

# Make alpha channel, supersampled by factor 4
ss = 4
alpha = Image.new('L', (im.width*ss, im.height*ss))

# Draw rounded rectangle and unsupersample
d = ImageDraw.Draw(alpha)
d.rounded_rectangle([0,0,im.width*ss-1,im.height*ss-1],radius=120,fill='white')
alpha = alpha.resize((alpha.width//ss, alpha.height//ss), resample=Image.Resampling.LANCZOS)
alpha.save('DEBUG-alpha.png')

# Push new alpha channel into original image and save
im.putalpha(alpha)
im.save('result.png')

© www.soinside.com 2019 - 2024. All rights reserved.