You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python Pillow实现图片中圆角矩形区域的模糊处理?

实现图片中圆角矩形区域的模糊效果

没问题,我来帮你把两段代码结合起来,实现你想要的圆角矩形区域模糊效果。核心思路是用圆角矩形遮罩来限制模糊区域的形状,这样模糊后的内容只会在圆角范围内显示,不会出现生硬的直角边缘。

下面是完整的可运行代码,我已经把你的两段代码整合并做了适配:

from PIL import Image, ImageDraw, ImageFilter

def round_corner(radius):
    corner = Image.new('RGBA', (radius, radius), (0, 0, 0, 0))
    draw = ImageDraw.Draw(corner)
    # 绘制1/4圆形的圆角(白色填充,作为遮罩的有效区域)
    draw.pieslice((0, 0, radius * 2, radius * 2), 180, 270, fill=(255, 255, 255, 255))
    return corner

def round_rectangle(rectangle, radius):
    corner = round_corner(radius)
    # 粘贴四个圆角到矩形的四个角落
    rectangle.paste(corner, (0, 0))
    rectangle.paste(corner.rotate(90), (0, rectangle.size[1] - radius))
    rectangle.paste(corner.rotate(180), (rectangle.size[0] - radius, rectangle.size[1] - radius))
    rectangle.paste(corner.rotate(270), (rectangle.size[0] - radius, 0))
    # 填充中间的矩形区域,确保整个圆角矩形都是遮罩有效区域
    draw = ImageDraw.Draw(rectangle)
    draw.rectangle([radius, 0, rectangle.size[0]-radius, rectangle.size[1]], fill=(255,255,255,255))
    draw.rectangle([0, radius, rectangle.size[0], rectangle.size[1]-radius], fill=(255,255,255,255))
    return rectangle

# 主逻辑
if __name__ == "__main__":
    # 打开原图
    img = Image.open('assets/images/image.png')
    
    # 定义圆角矩形区域参数
    x, y = 300, 1600  # 区域左上角坐标
    x2, y2 = 1000, 2600  # 区域右下角坐标
    radius = 50  # 圆角半径,可根据需求调整大小
    
    # 裁剪目标区域并进行高斯模糊
    cropped_area = (x, y, x2, y2)
    cropped_img = img.crop(cropped_area)
    blurred_img = cropped_img.filter(ImageFilter.GaussianBlur(20))
    
    # 创建与裁剪区域同尺寸的圆角遮罩
    mask = Image.new('RGBA', (x2 - x, y2 - y), (0, 0, 0, 0))
    mask = round_rectangle(mask, radius)
    
    # 将模糊后的图像通过遮罩粘贴回原图(仅遮罩不透明区域会被模糊覆盖)
    img.paste(blurred_img, (x, y), mask=mask)
    
    # 保存并查看结果
    img.save('assets/images/new.png')
    img.show()

关键调整说明:

  • 我给round_corner的扇形加上了白色填充,让遮罩的圆角部分成为有效覆盖区域;同时在round_rectangle里补充了中间矩形区域的填充,确保整个圆角矩形范围内都是遮罩的有效区域。
  • 粘贴模糊图像时,通过mask参数指定圆角遮罩,这样只有遮罩不透明的部分会被模糊图像覆盖,透明部分则保留原图内容,完美实现圆角区域的模糊效果。
  • 你可以通过调整radius值来改变圆角的大小,数值越大,圆角越圆润。

内容的提问来源于stack exchange,提问作者Lucas

火山引擎 最新活动