56 lines
2.0 KiB
Python
56 lines
2.0 KiB
Python
"""
|
||
分析 diff 图的像素差异分布,按纵向区域统计差异密度。
|
||
输出每 50px 逻辑高度段的差异百分比,帮助定位需要调整的区域。
|
||
"""
|
||
from pathlib import Path
|
||
from PIL import Image
|
||
import struct
|
||
|
||
SCREENSHOTS_DIR = Path(__file__).resolve().parents[2] / "docs" / "h5_ui" / "screenshots"
|
||
|
||
def analyze_diff_image(diff_path: Path, band_height: int = 150):
|
||
"""按纵向条带分析 diff 图的红色像素密度"""
|
||
img = Image.open(diff_path).convert("RGB")
|
||
w, h = img.size
|
||
pixels = img.load()
|
||
|
||
print(f"Diff 图尺寸: {w}×{h}")
|
||
print(f"条带高度: {band_height}px (逻辑 {band_height/3:.0f}px)")
|
||
print(f"{'区域':>8} {'逻辑Y':>8} {'差异像素':>10} {'总像素':>10} {'差异%':>8} {'条形图'}")
|
||
print("-" * 80)
|
||
|
||
bands = []
|
||
for y_start in range(0, h, band_height):
|
||
y_end = min(y_start + band_height, h)
|
||
diff_count = 0
|
||
total = 0
|
||
for y in range(y_start, y_end):
|
||
for x in range(w):
|
||
r, g, b = pixels[x, y]
|
||
total += 1
|
||
# diff 图中红色/品红色像素表示差异
|
||
if r > 200 and g < 100:
|
||
diff_count += 1
|
||
pct = (diff_count / total * 100) if total > 0 else 0
|
||
bar = "█" * int(pct / 2)
|
||
logical_y = y_start / 3
|
||
print(f"{y_start:>6}-{y_end:<6} {logical_y:>6.0f}px {diff_count:>10,} {total:>10,} {pct:>7.1f}% {bar}")
|
||
bands.append({"y_start": y_start, "y_end": y_end, "diff_pct": pct})
|
||
|
||
# 找出差异最大的区域
|
||
top_bands = sorted(bands, key=lambda b: b["diff_pct"], reverse=True)[:5]
|
||
print(f"\n差异最大的 5 个区域:")
|
||
for b in top_bands:
|
||
logical_y = b["y_start"] / 3
|
||
print(f" 逻辑 Y={logical_y:.0f}px: {b['diff_pct']:.1f}%")
|
||
|
||
def main():
|
||
diff_path = SCREENSHOTS_DIR / "diff-board-finance-v2.png"
|
||
if not diff_path.exists():
|
||
print(f"❌ diff 图不存在: {diff_path}")
|
||
return
|
||
analyze_diff_image(diff_path, band_height=150)
|
||
|
||
if __name__ == "__main__":
|
||
main()
|