Python 图片圆角处理 批量生成圆角PNG透明教程
用 Pillow 给图片加圆角,生成带透明背景的 PNG,支持指定圆角半径、批量处理文件夹、保留原比例,适合做头像、卡片、商品图。
场景痛点
做小程序头像、商品卡片、PPT 配图,都要求图片带圆角。用 PS 一张张画蒙版、导透明底,上百张图要做一天。用 Python 给每个角画一个圆弧形蒙版,原图像素按蒙版裁剪,直接输出带 alpha 透明通道的 PNG,圆角半径可统一调。
用到的库
pip install Pillow
完整代码
# -*- coding: utf-8 -*-
# 批量给图片加圆角,输出带透明背景的 PNG
import os
from PIL import Image, ImageDraw
IMG_EXTS = {".jpg", ".jpeg", ".png", ".bmp", ".webp"}
def round_corners(im, radius=40):
"""给 im 四个角加圆角,radius 是圆角半径(像素)"""
im = im.convert("RGBA")
# 新建一张和原图等大的透明蒙版,L 模式,黑底白圆
mask = Image.new("L", im.size, 0)
draw = ImageDraw.Draw(mask)
# 画一个铺满整张图的白色圆角矩形,半径 radius
draw.rounded_rectangle([(0, 0), (im.size[0], im.size[1])],
radius=radius, fill=255)
# 把蒙版作为 alpha 通道贴回去
result = Image.new("RGBA", im.size, (0, 0, 0, 0))
result.paste(im, (0, 0), mask)
return result
def batch_round(input_dir, output_dir, radius=40):
os.makedirs(output_dir, exist_ok=True)
for name in sorted(os.listdir(input_dir)):
ext = os.path.splitext(name)[1].lower()
if ext not in IMG_EXTS:
continue
try:
with Image.open(os.path.join(input_dir, name)) as im:
out = round_corners(im, radius=radius)
base, _ = os.path.splitext(name)
out.save(os.path.join(output_dir, base + ".png"))
print(f"圆角 {radius}px {name} -> {out.size}")
except Exception as e:
print(f"跳过 {name}: {e}")
if __name__ == "__main__":
# 把 ./raw 下所有图加 40px 圆角,输出到 ./rounded
batch_round("./raw", "./rounded", radius=40)
代码讲解
- 圆角本质是做一张蒙版:白色区域保留、黑色区域透明。
Image.new("L", size, 0)先铺一张全黑图,再用draw.rounded_rectangle在上面画一个白色圆角矩形。 paste(im, (0,0), mask)的第三个参数是蒙版:蒙版上 255 的地方保留原图,0 的地方透明,中间值做半透明抗锯齿。- 输出必须是 PNG(或 WebP),JPG 不支持透明通道,四角会被强制填白。
radius控制圆角大小,40 适合头像,20~30 适合卡片,做"胶囊"形状就把半径设成图片高度的一半。
运行结果
把原图放进 ./raw,运行后 ./rounded 里生成同名 .png,四角圆润、背景透明,直接拖到 PPT、Figma、网页里都不会有白底方块。
注意事项
rounded_rectangle是 Pillow 8.2 以上才有的方法,老版本请pip install -U Pillow。- 圆角半径不能超过图片短边的一半,否则会变形。
- 如果要加描边,可在画完圆角后再用
ImageDraw画一圈矩形边框,颜色自己定。 - 透明 PNG 文件体积比 JPG 大,发网页时建议转 WebP 压缩。

更新时间:2026-09-14 20:21:17