#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""三码精修 + 精确扫描：裁掉静默区 → 最近邻缩放（保模块硬边）→ Vision 解码

目的：把码做到「静默区最小 + 模块最锐」，并在多档尺寸上找出**三个码都稳**的显示尺寸。
"""
import os
import subprocess
from PIL import Image, ImageChops

QRDIR = '/Users/liuxinyuan/Desktop/Hermes输出-工作类/科研2026秋季促销/华南农大海报_20260920/qr'
SWIFT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类/脚本/decode_qr.swift'
OUT = '/tmp/qr_sweep2'
os.makedirs(OUT, exist_ok=True)

SIZES = [176, 180, 184, 188, 190]
NAMES = ['公众号.png', '小红书.png', '视频号.png']


def trim_code(img):
    """裁到码区（去掉外部白边），只留 6px 静默区"""
    bg = Image.new('L', img.size, 255)
    bb = ImageChops.difference(img, bg).getbbox()
    if not bb:
        return img
    q = 6
    bb = (max(0, bb[0] - q), max(0, bb[1] - q),
          min(img.width, bb[2] + q), min(img.height, bb[3] + q))
    return img.crop(bb)


print('码区尺寸 / 模块估算:')
prepared = {}
for n in NAMES:
    src = Image.open(os.path.join(QRDIR, n)).convert('L')
    code = trim_code(src)
    prepared[n] = code
    row = [1 if v < 128 else 0 for v in
           list(code.crop((0, code.height // 2, code.width, code.height // 2 + 1)).getdata())]
    runs, cur = [], 1
    for i in range(1, len(row)):
        if row[i] == row[i - 1]:
            cur += 1
        else:
            runs.append(cur); cur = 1
    runs.append(cur)
    m = min([r for r in runs if r > 1] or [1])
    print('  %-6s 码区 %dx%d  最小游程 %dpx  估模块数 ≈ %d'
          % (n[:-4], code.width, code.height, m, code.width // max(m, 1)))

print('\n尺寸扫描（裁静默区 + 最近邻）:')
tests = []
for n in NAMES:
    for s in SIZES:
        p = os.path.join(OUT, '%s_%d.png' % (n[:-4], s))
        prepared[n].resize((s, s), Image.NEAREST).convert('RGB').save(p)
        tests.append((n[:-4], s, p))

res = subprocess.run(['swift', SWIFT] + [t[2] for t in tests], capture_output=True, text=True)
ok = {}
for line in res.stdout.splitlines():
    parts = line.split('\t')
    if len(parts) < 3:
        continue
    f = os.path.basename(parts[0])
    key, size = f[:-4].rsplit('_', 1)
    if 'ERR' not in parts[1]:
        ok.setdefault(key, set()).add(int(size))

print()
for n in [x[:-4] for x in NAMES]:
    good = sorted(ok.get(n, []))
    print('  %-6s 可扫: %-28s 最小 %s px' % (n, good if good else '全失败 ✗', good[0] if good else '—'))
common = set(SIZES)
for n in [x[:-4] for x in NAMES]:
    common &= ok.get(n, set())
print('\n  三个码都稳的尺寸: %s' % (sorted(common) if common else '无 ✗ 需加大尺寸'))
