57 lines
2.9 KiB
Python
57 lines
2.9 KiB
Python
# 生成甄房 logo 位图替换资源
|
||
# 关键:旧 logo 的墨迹占画布约 90%,而甄房 mark 只占 69% —— 直接替换会让 logo 视觉缩小 25%。
|
||
# 本脚本把 mark 的墨迹等比缩放到占画布 90%,保持与原资源等大,替换后不改变版式。
|
||
# 用法: python _design-test/build-logos.py (预演)
|
||
# python _design-test/build-logos.py --write (真写)
|
||
import os, sys, shutil
|
||
from PIL import Image
|
||
|
||
SRC = r'D:\SGP_KF\DrawLogo\_design-test\logo\png'
|
||
ZF = r'e:\KF_7\ZhenOS-ZF'
|
||
WRITE = '--write' in sys.argv
|
||
INK_RATIO = 0.90 # 墨迹占画布比例,与原资源对齐
|
||
|
||
|
||
def fitted(src_name, canvas, ratio=INK_RATIO):
|
||
"""把 src 的墨迹等比缩放到占 canvas 的 ratio,居中放到透明画布上"""
|
||
im = Image.open(os.path.join(SRC, src_name)).convert('RGBA')
|
||
bb = im.getchannel('A').getbbox()
|
||
ink = im.crop(bb)
|
||
k = (canvas * ratio) / max(ink.width, ink.height)
|
||
ink = ink.resize((max(1, round(ink.width * k)), max(1, round(ink.height * k))), Image.LANCZOS)
|
||
out = Image.new('RGBA', (canvas, canvas), (0, 0, 0, 0))
|
||
out.paste(ink, ((canvas - ink.width) // 2, (canvas - ink.height) // 2), ink)
|
||
return out
|
||
|
||
|
||
JOBS = [
|
||
# 目标路径, 生成方式, 说明
|
||
(f'{ZF}/ruoyi-ui/src/assets/logo/logo.png', ('fitted', 'mark-p80-ink.png', 1000), 'WEB 登录页/工具页 · 墨蓝标'),
|
||
(f'{ZF}/ruoyi-ui/src/assets/logo/logo-sidebar.png', ('fitted', 'mark-p80-white.png', 1000), 'WEB 侧栏(墨蓝底)· 白标'),
|
||
(f'{ZF}/zhenfang-uni/src/static/logo.png', ('fitted', 'mark-p80-ink.png', 1000), 'H5 登录页(白卡内)· 墨蓝标'),
|
||
(f'{ZF}/ruoyi-ui/public/favicon.png', ('plain', 'appicon-512.png', None), 'WEB favicon · 应用图标'),
|
||
(f'{ZF}/xiaohuju/build/icons/icon.png', ('plain', 'appicon-512.png', None), 'Electron 托盘/窗口图标'),
|
||
]
|
||
|
||
ICO_OUT = f'{ZF}/xiaohuju/build/icons/icon.ico'
|
||
|
||
for dest, spec, label in JOBS:
|
||
before = os.path.getsize(dest) if os.path.exists(dest) else 0
|
||
kind = spec[0]
|
||
img = fitted(spec[1], spec[2]) if kind == 'fitted' else Image.open(os.path.join(SRC, spec[1])).convert('RGBA')
|
||
print(' %-58s %sx%s (%dB -> ~)' % (label, img.width, img.height, before))
|
||
if WRITE:
|
||
img.save(dest)
|
||
|
||
# 多尺寸 ICO(含 256,Windows 图标规范)
|
||
ico_sizes = [16, 24, 32, 48, 64, 128, 256]
|
||
base = Image.open(os.path.join(SRC, 'appicon-1024.png')).convert('RGBA')
|
||
imgs = [base.resize((s, s), Image.LANCZOS) for s in ico_sizes]
|
||
print(' %-58s %s' % ('Electron 应用图标 ICO', '/'.join(str(s) for s in ico_sizes)))
|
||
if WRITE:
|
||
imgs[-1].save(ICO_OUT, format='ICO', sizes=[(s, s) for s in ico_sizes])
|
||
|
||
print('\n' + ('已写入' if WRITE else '预演,未写入(加 --write 生效)'))
|
||
print('注:xiaohuju/build/icons/icon.icns(macOS)需在 macOS 上用 iconutil 生成,本机跳过;')
|
||
print(' xiaohuju/resources/app.png 是启动背景稿(含蓝色主体图形),需设计重做,本脚本不动。')
|