TOC

给头像加上五星红旗

效果:

以下代码参考微信公众号 可以叫我才哥 发布的《五星红旗国庆头像制作教程来了》(原文链接):
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()

五星红旗图片下载自维基百科(800px下载链接)。

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