# 大图道具原图 → 32x32 小图标(透明底,居中)。
# 用法: python _analysis/make_icon.py 输入.png [输出.png] [--size 32] [--margin 1]
#        [--bg auto|none|RRGGBB] [--tol 40] [--colors 0] [--pixel]
#   --bg auto : 自动从四角取背景色并抠成透明(默认; 适合白底/纯色底原图)
#   --bg none : 原图已带透明通道, 不抠背景
#   --bg RRGGBB: 指定背景色
#   --tol     : 背景容差(越大抠得越多)
#   --colors N: 缩小后量化到 N 色(像素风更明显; 0=不量化)
#   --pixel   : 用最近邻缩放(硬像素块) 而非平滑LANCZOS
import sys
from collections import deque
from PIL import Image

a = sys.argv[1:]
def opt(name, default=None, flag=False):
    if flag:
        if name in a: a.remove(name); return True
        return False
    if name in a:
        i = a.index(name); v = a[i+1]; del a[i:i+2]; return v
    return default

size   = int(opt('--size', 32))
margin = int(opt('--margin', 1))
bg     = opt('--bg', 'auto')
tol    = int(opt('--tol', 40))
colors = int(opt('--colors', 0))
pixel  = opt('--pixel', flag=True)
src = a[0]
dst = a[1] if len(a) > 1 else src.rsplit('.', 1)[0] + '_icon.png'

im = Image.open(src).convert('RGBA')
W, H = im.size
px = im.load()

# 1) 抠背景 → 透明（仅当需要）
if bg != 'none':
    if bg == 'auto':
        corners = [px[0,0], px[W-1,0], px[0,H-1], px[W-1,H-1]]
        bgc = max(set(corners), key=corners.count)[:3]
    else:
        bgc = tuple(int(bg[i:i+2], 16) for i in (0, 2, 4))
    def isbg(x, y):
        r, g, b, al = px[x, y]
        return al > 0 and abs(r-bgc[0]) <= tol and abs(g-bgc[1]) <= tol and abs(b-bgc[2]) <= tol
    visited = [[False]*W for _ in range(H)]
    dq = deque()
    for x in range(W):
        for y in (0, H-1):
            if isbg(x, y) and not visited[y][x]: visited[y][x]=True; dq.append((x,y))
    for y in range(H):
        for x in (0, W-1):
            if isbg(x, y) and not visited[y][x]: visited[y][x]=True; dq.append((x,y))
    while dq:
        x, y = dq.popleft()
        px[x, y] = (px[x,y][0], px[x,y][1], px[x,y][2], 0)
        for dx, dy in ((1,0),(-1,0),(0,1),(0,-1)):
            nx, ny = x+dx, y+dy
            if 0<=nx<W and 0<=ny<H and not visited[ny][nx] and isbg(nx, ny):
                visited[ny][nx]=True; dq.append((nx, ny))

# 2) 裁到内容(alpha)包围盒
bbox = im.getbbox()
if bbox: im = im.crop(bbox)

# 3) 等比缩放进 (size-2margin) 方框, 居中贴到 size×size 透明画布
inner = size - 2*margin
w, h = im.size
scale = min(inner / w, inner / h)
nw, nh = max(1, round(w*scale)), max(1, round(h*scale))
resample = Image.NEAREST if pixel else Image.LANCZOS
im = im.resize((nw, nh), resample)

# 4) 可选量化颜色(像素风); 量化只对不透明部分, 保留 alpha
if colors > 0:
    rgb = im.convert('RGB').quantize(colors=colors, dither=Image.NONE).convert('RGBA')
    r, g, b, alpha = im.split()
    rr, gg, bb, _ = rgb.split()
    im = Image.merge('RGBA', (rr, gg, bb, alpha))

canvas = Image.new('RGBA', (size, size), (0,0,0,0))
canvas.paste(im, ((size-nw)//2, (size-nh)//2), im)
canvas.save(dst)
print('输出', dst, canvas.size, '| 内容原尺寸', (w, h), '→', (nw, nh), '| bg', bg, 'tol', tol, 'colors', colors, 'pixel', pixel)
