98 lines
3.3 KiB
Python
98 lines
3.3 KiB
Python
|
|
"""穷举 process_image 的参数组合,找出哪种组合会产出"未紧致裁剪"的输出。
|
|||
|
|
|
|||
|
|
逻辑:
|
|||
|
|
final.png (153x74, bbox=(0,0,153,74)) 是已知正确的紧致输出。
|
|||
|
|
遍历 is_signature/height_cm 等参数,跑 process_image,对比输出:
|
|||
|
|
- 尺寸 == (153, 74)?
|
|||
|
|
- bbox 是否贴满?
|
|||
|
|
- 字节内容是否与 final.png 完全一致?
|
|||
|
|
任何一项不一致 -> 找到 bug 触发条件。
|
|||
|
|
|
|||
|
|
输入图: image_test/input/test1.jpg
|
|||
|
|
"""
|
|||
|
|
import io
|
|||
|
|
import sys
|
|||
|
|
import hashlib
|
|||
|
|
from pathlib import Path
|
|||
|
|
from PIL import Image, ImageChops
|
|||
|
|
|
|||
|
|
BASE_DIR = Path(__file__).resolve().parent
|
|||
|
|
PROJECT_ROOT = BASE_DIR.parent
|
|||
|
|
INPUT_IMAGE = BASE_DIR / "input" / "test1.jpg"
|
|||
|
|
FINAL_REF = BASE_DIR / "output" / "test1" / "final.png"
|
|||
|
|
|
|||
|
|
|
|||
|
|
def _ensure_path():
|
|||
|
|
if str(PROJECT_ROOT) not in sys.path:
|
|||
|
|
sys.path.insert(0, str(PROJECT_ROOT))
|
|||
|
|
|
|||
|
|
|
|||
|
|
def _stats(data):
|
|||
|
|
img = Image.open(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():
|
|||
|
|
_ensure_path()
|
|||
|
|
sys.stdout.reconfigure(encoding='utf-8')
|
|||
|
|
|
|||
|
|
if not INPUT_IMAGE.exists():
|
|||
|
|
print(f"缺少: {INPUT_IMAGE}")
|
|||
|
|
sys.exit(1)
|
|||
|
|
if not FINAL_REF.exists():
|
|||
|
|
print(f"缺少: {FINAL_REF},请先运行 image_test/process.py 生成")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
with open(INPUT_IMAGE, 'rb') as f:
|
|||
|
|
image_bytes = f.read()
|
|||
|
|
with open(FINAL_REF, 'rb') as f:
|
|||
|
|
final_bytes = f.read()
|
|||
|
|
|
|||
|
|
final_stats = _stats(final_bytes)
|
|||
|
|
print(f"=== 参考基准 final.png ===")
|
|||
|
|
print(f" 尺寸={final_stats['size']} bbox={final_stats['bbox']} "
|
|||
|
|
f"内容={final_stats['content_pct']:.1f}% 字节={final_stats['bytes']} "
|
|||
|
|
f"sha={final_stats['sha']}")
|
|||
|
|
print()
|
|||
|
|
|
|||
|
|
from lib.image_processor import process_image
|
|||
|
|
|
|||
|
|
cases = [
|
|||
|
|
# (label, kwargs)
|
|||
|
|
("is_sig=True noise=0 rot=0", {'is_signature': True}),
|
|||
|
|
("is_sig=False noise=0 rot=0", {'is_signature': False}),
|
|||
|
|
("is_sig=True noise=3 rot=0", {'is_signature': True, 'noise_level': 3}),
|
|||
|
|
("is_sig=True noise=0 rot=-5,5",{'is_signature': True, 'rotate_min': -5, 'rotate_max': 5}),
|
|||
|
|
("is_sig=True noise=3 rot=-5,5",{'is_signature': True, 'noise_level': 3, 'rotate_min': -5, 'rotate_max': 5}),
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
print(f"=== 穷举 {len(cases)} 种参数组合 ===\n")
|
|||
|
|
for label, kw in cases:
|
|||
|
|
out = process_image(image_bytes, log_source='测试', **kw)
|
|||
|
|
s = _stats(out)
|
|||
|
|
tight = (s['bbox'] == (0, 0, s['size'][0], s['size'][1]))
|
|||
|
|
same_as_final = (out == final_bytes)
|
|||
|
|
flag = "✓紧致" if tight else "✗有padding"
|
|||
|
|
flag2 = "=final" if same_as_final else "≠final"
|
|||
|
|
print(f"[{label}]")
|
|||
|
|
print(f" 尺寸={s['size']} bbox={s['bbox']} 内容={s['content_pct']:.1f}% "
|
|||
|
|
f"字节={s['bytes']} {flag} {flag2}")
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == '__main__':
|
|||
|
|
main()
|