#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ SerialMate 图标栅格化(家族风格, 与 DLPilot/EDID-Viewer/FlashTool 同版式): 黑底 512, 绿色圆角矩形, 第一行 Serial(框内黑字), 第二行 Mate(白字) ================================================================ 设计参数: 黑底 512, 绿色圆角矩形 x38 y64 w436 h186 rx34 (#00C878, 与 gd32e230f8_firmware_merge_tool 的 FlashTool 同色系), Arial Bold。 Serial 6 字母按框宽自适应字号(上限 146px, 留边距), Mate 146px 白字(基线对齐同 DLPilot 的 Pilot)。 用法: python make_icon.py # 生成 serial-mate.png / serial-mate.ico """ import os from PIL import Image, ImageDraw, ImageFont BASE = os.path.dirname(os.path.abspath(__file__)) FONT = r'C:\Windows\Fonts\arialbd.ttf' # Arial Bold, Windows 标配 def fit_font(draw, text, max_w, start): """从 start 字号往下找能装入 max_w 宽的字号(步进 2)""" size = start while size > 8: f = ImageFont.truetype(FONT, size) box = draw.textbbox((0, 0), text, font=f) if box[2] - box[0] <= max_w: return f size -= 2 return ImageFont.truetype(FONT, 8) def render(size=512): s = size / 512.0 img = Image.new('RGB', (size, size), (0, 0, 0)) d = ImageDraw.Draw(img) d.rounded_rectangle([38 * s, 64 * s, (38 + 436) * s, (64 + 186) * s], radius=34 * s, fill=(0, 200, 120)) if not os.path.exists(FONT): raise SystemExit(f'未找到字体 {FONT}, 无法栅格化') # Serial: 黑字居中于橙色框, 按框宽自适应(留 2×18px 边距) f1 = fit_font(d, 'Serial', 400 * s, round(146 * s)) d.text((size / 2, 64 * s + 186 * s / 2), 'Serial', font=f1, fill=(0, 0, 0), anchor='mm') # Mate: 白字, 与家族一致 146px(无下伸字母, 中心 = 基线421 - cap/2 ~= 368) f2 = ImageFont.truetype(FONT, max(8, round(146 * s))) d.text((size / 2, 368 * s), 'Mate', font=f2, fill=(255, 255, 255), anchor='mm') return img if __name__ == '__main__': img = render(512) png = os.path.join(BASE, 'serial-mate.png') ico = os.path.join(BASE, 'serial-mate.ico') img.save(png) img.save(ico, sizes=[(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)]) print(f'写出 {png}') print(f'写出 {ico}')