效果:
以下代码参考微信公众号 可以叫我才哥 发布的《五星红旗国庆头像制作教程来了》(原文链接):
PS: 在原代码基础之上,我做了一些调整。
import itertools
import math
import os
from PIL import Image
def crop_redflag_square(img: Image) -> Image:
# 根据国旗比例,五角星的位置:
# 在 (1/15 Weight, 1/20 Height) 的位置,
# 11/30 Weight X 9/20 Height 的区域
w, h = img.size
x1 = int(w / 15 * 0.99)
y1 = int(h / 20 * 0.99)
# square_size = int(w * 11 / 30 * 1.02)
square_size = int(w * 16 / 30)
x2 = x1 + square_size
y2 = y1 + square_size
return img.crop((x1, y1, x2, y2))
def create_mask(img: Image, size: tuple[int, int]) -> Image:
# 与头像尺寸对齐
img = img.resize(size)
img = img.convert('RGBA')
w, h = size
# 采用正方形国旗制作掩膜(Mask)
for x, y in itertools.product(range(w), range(h)):
color = img.getpixel((x, y))
alpha = int((255 - 88) * (1 - (x + y * 0.5) / (w + h * 0.5))) # 透明度
if alpha < 0:
alpha = 0
color = color[:-1] + (alpha, )
img.putpixel((x, y), color)
return img
def main():
flag = Image.open(os.path.expanduser('~/Pictures/redflag-800px.png'))
avatar = Image.open(os.path.expanduser('~/Pictures/ICON/markjour.png'))
flag = flag.convert("RGB")
avatar = avatar.convert("RGB")
# 截图(正方形国旗)
flag_square = crop_redflag_square(flag)
# flag_square.save('/tmp/flag_square.png')
# 创建掩膜
mask = create_mask(flag_square, avatar.size)
# 图片合成 paste(im, box, mask)
avatar.paste(mask, (0, 0), mask)
avatar.save('/tmp/avatar.png')
if __name__ == '__main__':
main()
identify ICON/markjour.png redflag-800px.png
ICON/markjour.png PNG 120x120 120x120+0+0 8-bit sRGB 5276B 0.000u 0:00.000
redflag-800px.png PNG 800x533 800x533+0+0 8-bit sRGB 229c 5069B 0.000u 0:00.000
附:五星红旗
参考维基百科词条 中华人民共和国国旗:
宽高比为 3:2