#!/usr/bin/env python3 """test_meow_img_budget_gen.py — 为宿主测试 test_meow_img_budget.c 生成图片夹具。 用法:python3 test_meow_img_budget_gen.py <输出目录> 依赖:Pillow(PIL)。夹具只含结构化图案(白底/黑线/灰块),体积极小。 生成: big.jpg 3200x2600 baseline 4:2:0 JPEG(8.32MP,峰值对比主用例) bigprog.jpg 3200x2600 progressive JPEG(验证进升级解码走同一缩解路径) page.jpg 1600x2400 baseline JPEG(finding 里 15.4MB 的漫画页原尺寸) small.jpg 64x64 baseline JPEG(「小图不动」用例) big.png 2400x1600 RGB PNG(stb 无解码期缩放:峰值如实记录,不作改善断言) big.bmp 2400x1600 24bpp BMP(同上) broken.jpg JPEG 魔数 + 垃圾字节(头部解析失败,坏图用例) """ import os import sys from PIL import Image, ImageDraw def page_pattern(w, h): """漫画页近似:白底 + 分镜框线 + 灰阶网点带。内容稀疏 → JPEG 体积小。""" im = Image.new("RGB", (w, h), (250, 249, 245)) d = ImageDraw.Draw(im) for k in range(0, min(w, h) - 400, 60): d.rectangle([100 + k, 100 + k, 400 + k, 300 + k], outline=(12, 12, 14), width=5) for band in range(14): y0 = band * h // 14 for x in range(0, w, 9): d.line([(x, y0), (x + 4, y0 + 7)], fill=(110, 110, 116)) return im def main(): if len(sys.argv) != 2: print(__doc__) return 2 out = sys.argv[1] os.makedirs(out, exist_ok=True) big = page_pattern(3200, 2600) big.save(os.path.join(out, "big.jpg"), "JPEG", quality=55, subsampling=2) big.save(os.path.join(out, "bigprog.jpg"), "JPEG", quality=55, subsampling=2, progressive=True) small = page_pattern(64, 64) small.save(os.path.join(out, "small.jpg"), "JPEG", quality=80, subsampling=2) page = page_pattern(1600, 2400) page.save(os.path.join(out, "page.jpg"), "JPEG", quality=55, subsampling=2) mid = page_pattern(2400, 1600) mid.save(os.path.join(out, "big.png"), "PNG") mid.save(os.path.join(out, "big.bmp"), "BMP") # 坏图:JPEG 魔数 + 垃圾字节 → 头部解析失败(stb 对「截断但头部完整」很宽容,不能只截断) garbage = bytes((i * 37 + 11) & 0xFF for i in range(256)) with open(os.path.join(out, "broken.jpg"), "wb") as f: f.write(b"\xff\xd8\xff\xe0" + garbage) for name in ("big.jpg", "bigprog.jpg", "page.jpg", "small.jpg", "big.png", "big.bmp", "broken.jpg"): print(" %-12s %8d B" % (name, os.path.getsize(os.path.join(out, name)))) return 0 if __name__ == "__main__": sys.exit(main())