Files
lgp-wx-plus/scripts/make-package-tab-icons.py
2026-08-19 08:17:18 +08:00

78 lines
2.1 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 -*-
"""画套餐底栏 PNG盒子线稿 / 实心底,微信自定义栏必须用本地图。"""
import struct
import zlib
from pathlib import Path
SIZE = 81
def png(rgba_rows):
def chunk(tag, data):
return struct.pack('>I', len(data)) + tag + data + struct.pack('>I', zlib.crc32(tag + data) & 0xFFFFFFFF)
raw = b''.join(b'\x00' + bytes(row) for row in rgba_rows)
return (
b'\x89PNG\r\n\x1a\n'
+ chunk(b'IHDR', struct.pack('>IIBBBBB', SIZE, SIZE, 8, 6, 0, 0, 0))
+ chunk(b'IDAT', zlib.compress(raw, 9))
+ chunk(b'IEND', b'')
)
def blank():
return [[0, 0, 0, 0] * SIZE for _ in range(SIZE)]
def set_px(rows, x, y, a=255):
if 0 <= x < SIZE and 0 <= y < SIZE:
i = x * 4
rows[y][i:i + 4] = [28, 25, 23, a]
def line(rows, x0, y0, x1, y1, w=3):
steps = max(abs(x1 - x0), abs(y1 - y0), 1)
for i in range(steps + 1):
t = i / steps
x = int(round(x0 + (x1 - x0) * t))
y = int(round(y0 + (y1 - y0) * t))
for dx in range(-w // 2, w // 2 + 1):
for dy in range(-w // 2, w // 2 + 1):
set_px(rows, x + dx, y + dy)
def rect(rows, x, y, w, h, r=4, fill=False):
if fill:
for yy in range(y, y + h):
for xx in range(x, x + w):
set_px(rows, xx, yy)
return
line(rows, x + r, y, x + w - r, y)
line(rows, x + w, y + r, x + w, y + h - r)
line(rows, x + w - r, y + h, x + r, y + h)
line(rows, x, y + h - r, x, y + r)
def write_icons(out_dir):
out = Path(out_dir)
outline = blank()
# 盒身
rect(outline, 16, 30, 49, 38, 5)
line(outline, 16, 44, 65, 44)
line(outline, 40, 30, 40, 68)
line(outline, 24, 30, 40, 16)
line(outline, 40, 16, 56, 30)
(out / 'package.png').write_bytes(png(outline))
filled = blank()
rect(filled, 16, 26, 49, 42, 4, fill=True)
line(filled, 24, 26, 40, 12)
line(filled, 40, 12, 56, 26)
(out / 'package-fill.png').write_bytes(png(filled))
if __name__ == '__main__':
here = Path(__file__).resolve().parents[1] / 'static' / 'tabbar' / 'v2'
write_icons(here)
print('wrote', here)