Files
homepage/tools/make_favicon.py

40 lines
1.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
"""
从反白 logo 提取左侧图形生成 favicon(180x180 PNG):
深色圆角底(与站内卡片底色一致)+ 图形居中占 72%
标签栏明暗模式均以深色块呈现,反白图形恒清晰。
用法: uv run --with pillow python3 tools/make_favicon.py
"""
from PIL import Image, ImageDraw
SRC = 'assets/img/logo-light.png'
OUT = 'assets/img/favicon.png'
SIZE = 180
PAD_GRAPHIC = 0.72 # 图形占画布比例
# logo 左侧图形实测内容段(x 投影分析):x[47:224] y[44:260],取 bbox 略收边
CROP = (47, 44, 224, 260)
BG = (7, 11, 22) # 站内 --bg-1
RADIUS = 38
graphic = Image.open(SRC).convert('RGBA').crop(CROP)
canvas = Image.new('RGBA', (SIZE, SIZE), (0, 0, 0, 0))
# 圆角深色底
mask = Image.new('L', (SIZE, SIZE), 0)
ImageDraw.Draw(mask).rounded_rectangle((0, 0, SIZE, SIZE), RADIUS, fill=255)
canvas.paste(Image.new('RGBA', (SIZE, SIZE), BG + (255,)), (0, 0), mask)
# 图形等比缩放到 72% 高度内居中
target = round(SIZE * PAD_GRAPHIC)
scale = min(target / graphic.width, target / graphic.height)
graphic = graphic.resize((round(graphic.width * scale), round(graphic.height * scale)), Image.LANCZOS)
canvas.alpha_composite(graphic, ((SIZE - graphic.width) // 2, (SIZE - graphic.height) // 2))
# 自检:中心应有不透明图形像素,四角透明
px = canvas.load()
assert px[SIZE // 2, SIZE // 2][3] > 0, '中心无图形'
assert px[2, 2][3] == 0 and px[SIZE - 3, SIZE - 3][3] == 0, '圆角未生效'
canvas.save(OUT, 'PNG', optimize=True)
print(f'完成: {OUT} {SIZE}x{SIZE},图形 {graphic.size}')