一.前言
先看效果:
原图:
处理后的图:圆角+黑边
二.原理
PIL给图片添加圆角逻辑:
-
1.创建一个黑色透明方块,边长为圆角直径
-
2.在黑色方块内,创建一个白色不透明圆形,半径为圆角半径
-
3.创建一个穿白色不透明的过滤层,尺寸和原图尺寸一样,用来切割图片圆角
-
4.把步骤2的图片切割成四个角,分别paste到步骤3的过滤层的四个角,我们得到一张过滤层
-
5.使用Image.putalpha函数,替换原图的aplha层,这样就切割成功了。
-
6.然后我们使用ImageDraw类在原图上画一个圆角矩形即可
三.核心API
先附上Pillow的Image Module的官方文档:
https://pillow.readthedocs.io/en/stable/reference/Image.html
img = Image.New()
:创建一个Image
draw = ImageDraw.Draw(img)
:基于一个Image来进行绘制
circle.crop(box)
:从图像返回一个矩形区域
alpha.paste(im, box, mask)
:将另一个图像粘贴到该图像中
img.putalpha(alpha)
:添加或替换此图像中的 alpha 层
四.源码
下面直接上代码:
from PIL import Image, ImageDraw
import os
def circle_corner(img, radii):
circle = Image.new('L', (radii * 2, radii * 2), 0) # 创建黑色方形
draw = ImageDraw.Draw(circle)
draw.ellipse((0, 0, radii * 2, radii * 2), fill=255) # 黑色方形内切白色圆形
img = img.convert("RGBA")
w, h = img.size
#创建一个alpha层,存放四个圆角,使用透明度切除圆角外的图片
alpha = Image.new('L', img.size, 255)
alpha.paste(circle.crop((0, 0, radii, radii)), (0, 0)) # 左上角
alpha.paste(circle.crop((radii, 0, radii * 2, radii)),
(w - radii, 0)) # 右上角
alpha.paste(circle.crop((radii, radii, radii * 2, radii * 2)),
(w - radii, h - radii)) # 右下角
alpha.paste(circle.crop((0, radii, radii, radii * 2)),
(0, h - radii)) # 左下角
img.putalpha(alpha) # 白色区域透明可见,黑色区域不可见
# 添加圆角边框
draw = ImageDraw.Draw(img)
draw.rounded_rectangle(img.getbbox(), outline="black", width=3, radius=radii)
return img
if __name__ == '__main__':
radii = 20 # 圆角大小
filePath = 'C:/Users/Desktop/Src'
outPath = 'C:/Users/Desktop/Des'
for i, j, k in os.walk(filePath):
for filename in k:
src = filePath + "/" + filename
des = outPath + "/" + filename
print(src)
img = Image.open(src)
img = circle_corner(img, radii)
img.save(des, 'png', quality=100)