"""生成 SerialMate 图标(Pillow, 开发时手动运行): 蓝底白色波形 + RS485 字样""" from pathlib import Path from PIL import Image, ImageDraw, ImageFont out = Path(__file__).resolve().parent size = 512 img = Image.new('RGBA', (size, size), (0, 0, 0, 0)) d = ImageDraw.Draw(img) d.rounded_rectangle((24, 24, 488, 488), radius=96, fill='#0f6cbd') d.rounded_rectangle((24, 24, 488, 488), radius=96, outline='#5ab0f2', width=10) # 示波器式白色波形(锯齿+衰减循环, 手绘点位) wave = [(56, 268)] segs = ((46, -96), (40, 84), (52, -52), (38, 66), (60, -120), (44, 78), (50, -40), (42, 56), (56, -88), (44, 60)) x, y = 56, 268 for half, dy in segs: d.line((x, y, x + half // 2, y + dy), fill='white', width=20) d.line((x + half // 2, y + dy, x + half, y), fill='white', width=20) x, y = x + half, y d.ellipse((x - 10, y - 10, x + 10, y + 10), fill='white') # 顶部 TX/RX 指示点 for cx, color in ((88, '#ffd166'), (146, '#7ee081')): d.ellipse((cx - 17, 84 - 17, cx + 17, 84 + 17), fill=color) font = 'C:/Windows/Fonts/arialbd.ttf' d.text((256, 410), 'RS485', font=ImageFont.truetype(font, 72), anchor='mm', fill='white') img.save(out / 'serial-mate.png') img.save(out / 'serial-mate.ico', sizes=[(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)]) print('icon ->', out / 'serial-mate.ico')