first commit
This commit is contained in:
82
image_test/compare_project_vs_test.py
Normal file
82
image_test/compare_project_vs_test.py
Normal file
@@ -0,0 +1,82 @@
|
||||
"""对比"项目实际产出的处理图" 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()
|
||||
Reference in New Issue
Block a user