I.はじめに
効果を最初に見てください:
元の画像:
処理された画像:丸い角+黒い境界線
2.原則
PILは、画像に丸みを帯びたコーナーロジックを追加します。
-
1.一辺の長さが角の直径に等しい黒い透明な正方形を作成します
-
2.黒い正方形の内側に、角の半径を持つ白い不透明な円を作成します
-
3.元の画像と同じサイズの白い不透明なフィルターレイヤーを作成して、画像の丸みを帯びた角を切り取ります
-
4.手順2の画像を4つの角に切り取り、手順3のフィルターレイヤーの4つの角に貼り付けて、フィルターレイヤーを取得します。
-
5. Image.putalpha関数を使用して、元の画像のaplhaレイヤーを置き換え、カットが成功するようにします。
-
6.次に、ImageDrawクラスを使用して、元の画像に角の丸い長方形を描画します
3.コアAPI
まず、Pillowの画像モジュールの公式ドキュメントを添付してください:
https ://pillow.readthedocs.io/en/stable/reference/Image.html
img = Image.New()
:画像を作成する:画像から
draw = ImageDraw.Draw(img)
描画
circle.crop(box)
する:画像から長方形の領域を返す
alpha.paste(im, box, mask)
:この画像に別の画像を貼り付ける
img.putalpha(alpha)
:この画像のアルファレイヤーを追加または置換する
4.ソースコード
すぐ下のコード:
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)