- 黑底/绿色圆角框 rgb(0,200,120)/框内黑字 Serial + 白字 Mate, 与 DLPilot/EDID-Viewer/FlashTool 同版式
63 lines
2.3 KiB
Python
63 lines
2.3 KiB
Python
#!/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}')
|