# -*- coding: utf-8 -*- from PIL import Image, ImageDraw import os OUT = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'app', 'public', 'icons') os.makedirs(OUT, exist_ok=True) BRAND = (48, 86, 211) BRAND_DARK = (35, 62, 160) def make(size, safe=1.0): ss = size * 4 img = Image.new('RGBA', (ss, ss), (0, 0, 0, 0)) grad = Image.new('RGBA', (ss, ss), (0, 0, 0, 0)) gd = ImageDraw.Draw(grad) for y in range(ss): t = y / ss c = tuple(int(BRAND[i] + (BRAND_DARK[i] - BRAND[i]) * t) for i in range(3)) + (255,) gd.line([(0, y), (ss, y)], fill=c) mask = Image.new('L', (ss, ss), 0) ImageDraw.Draw(mask).rounded_rectangle([0, 0, ss - 1, ss - 1], radius=ss // 5, fill=255) img.paste(grad, (0, 0), mask) d = ImageDraw.Draw(img) white = (255, 255, 255, 240) # safe 缩放:maskable 时内容收缩到中心 70% 区域 cx, cy, k = ss / 2, ss / 2, safe d.ellipse([cx - 0.18*ss*k, cy - 0.34*ss*k, cx + 0.18*ss*k, cy + 0.10*ss*k], fill=white) d.ellipse([cx + 0.03*ss*k, cy + 0.08*ss*k, cx + 0.33*ss*k, cy + 0.34*ss*k], fill=(255, 255, 255, 200)) return img.resize((size, size), Image.LANCZOS) make(192).save(os.path.join(OUT, 'pwa-192.png')) make(512).save(os.path.join(OUT, 'pwa-512.png')) make(512, safe=0.7).save(os.path.join(OUT, 'maskable-512.png')) print('pwa icons:', os.listdir(OUT))