"""对比"项目实际产出的处理图" vs "测试脚本产出的 final.png"。 使用前置条件: 1. 已经在前端跑过一次签章,image_test/output/project_run/ 下有 _2_processed.png 2. 已经跑过 image_test/process.py,image_test/output/test1/final.png 存在 输出: 逐文件对比尺寸/字节/SHA256,给出"完全一致 / 仅尺寸相同 / 完全不同"的判定。 """ import sys import hashlib from pathlib import Path from PIL import Image, ImageChops BASE_DIR = Path(__file__).resolve().parent PROJECT_RUN_DIR = BASE_DIR / "output" / "project_run" TEST_FINAL = BASE_DIR / "output" / "test1" / "final.png" def stats(data): img = Image.open(__import__('io').BytesIO(data)) if img.mode != 'RGBA': img = img.convert('RGBA') r, g, b, a = img.split() luma = Image.merge('RGB', (r, g, b)).convert('L') am = a.point(lambda p: 255 if p > 30 else 0) lm = luma.point(lambda p: 255 if p < 210 else 0) combined = ImageChops.darker(am, lm) total = img.size[0] * img.size[1] or 1 return { 'size': img.size, 'bbox': combined.getbbox(), 'content_pct': 100.0 * sum(combined.histogram()[1:]) / total, 'sha': hashlib.sha256(data).hexdigest()[:12], 'bytes': len(data), } def main(): sys.stdout.reconfigure(encoding='utf-8') if not TEST_FINAL.exists(): print(f"缺少基准文件: {TEST_FINAL}") print("请先运行: python image_test/process.py") sys.exit(1) if not PROJECT_RUN_DIR.exists(): print(f"缺少项目运行输出目录: {PROJECT_RUN_DIR}") print("请先在前端跑一次签章(已重启服务)") sys.exit(1) processed_files = sorted(PROJECT_RUN_DIR.glob("*_2_processed.png")) if not processed_files: print(f"在 {PROJECT_RUN_DIR} 下未找到 *_2_processed.png 文件") sys.exit(1) final_data = TEST_FINAL.read_bytes() final_s = stats(final_data) print(f"=== 基准: {TEST_FINAL.name} ===") print(f" 尺寸={final_s['size']} bbox={final_s['bbox']} " f"内容={final_s['content_pct']:.1f}% bytes={final_s['bytes']} sha={final_s['sha']}") print() print(f"=== 找到 {len(processed_files)} 个项目输出,逐个对比 ===\n") for p in processed_files: data = p.read_bytes() s = stats(data) identical = (data == final_data) same_size = (s['size'] == final_s['size']) print(f"[{p.name}]") print(f" 尺寸={s['size']} bbox={s['bbox']} 内容={s['content_pct']:.1f}% " f"bytes={s['bytes']} sha={s['sha']}") if identical: print(f" 判定: ✓ 与 final.png 逐字节完全一致") elif same_size: print(f" 判定: △ 尺寸相同但字节不同(可能只是 PNG 编码差异,目视应该一样)") else: print(f" 判定: ✗ 与 final.png 不同!尺寸={s['size']} vs {final_s['size']}") print() if __name__ == '__main__': main()