diff --git a/SerialMate/assets/make_icon.py b/SerialMate/assets/make_icon.py index 18a2302..a25e52e 100644 --- a/SerialMate/assets/make_icon.py +++ b/SerialMate/assets/make_icon.py @@ -1,35 +1,62 @@ -"""生成 SerialMate 图标(Pillow, 开发时手动运行): 蓝底白色波形 + RS485 字样""" -from pathlib import Path +#!/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 -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) +BASE = os.path.dirname(os.path.abspath(__file__)) +FONT = r'C:\Windows\Fonts\arialbd.ttf' # Arial Bold, Windows 标配 -# 示波器式白色波形(锯齿+衰减循环, 手绘点位) -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) +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) -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') + +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}') diff --git a/SerialMate/assets/serial-mate.ico b/SerialMate/assets/serial-mate.ico index 2927067..b7d1ea3 100644 Binary files a/SerialMate/assets/serial-mate.ico and b/SerialMate/assets/serial-mate.ico differ diff --git a/SerialMate/assets/serial-mate.png b/SerialMate/assets/serial-mate.png index 4284b3c..0f76f51 100644 Binary files a/SerialMate/assets/serial-mate.png and b/SerialMate/assets/serial-mate.png differ