test: 零依赖对拍测试台(可在不改 dist/ 的前提下复现 WE 行为)
tools/serve.mjs 本地静态服务 + 测试驱动注入(模拟 WE 下发用户属性、冻结动画相位、藏 canvas 取参考帧) tools/cdp.mjs 最小 CDP 客户端(真实时间等待;--screenshot 的虚拟时间会在骨骼加载完成前就耗尽) tools/shot.mjs 截图/取状态,就绪判据可传入 tools/diff.mjs ffmpeg 差分:PSNR / SSIM / 平均亮度差 tools/capture.mjs 对拍矩阵:壁纸 × 分辨率 × (正常, 藏 canvas) 实测:xilian 1920x1080 spine 层贡献 mean|diff|=26.1/255,kv37 为 10.2/255, 同配置两次截图噪声底 0.68/255。
This commit is contained in:
1 parent
d8c7e492f7
commit
399f99edd7
7 files changed
+499
No files matched your search
@@ -0,0 +1,49 @@
|
||||
// 两张 PNG 的数值对拍:PSNR / SSIM / 平均亮度差(0-255)。
|
||||
// 用法:node tools/diff.mjs <a.png> <b.png> [diff-out.png]
|
||||
// 判读:平均差 < 1 视为肉眼无差异;1-3 为细微;> 8 通常意味着构图/内容变了。
|
||||
|
||||
import { spawn } from "node:child_process";
|
||||
|
||||
const [a, b, outPng] = process.argv.slice(2);
|
||||
if (!a || !b) {
|
||||
console.error("usage: node tools/diff.mjs <a.png> <b.png> [diff-out.png]");
|
||||
process.exit(2);
|
||||
}
|
||||
|
||||
function ff(args) {
|
||||
return new Promise((resolve) => {
|
||||
const p = spawn("ffmpeg", ["-hide_banner", "-loglevel", "info", ...args], { stdio: ["ignore", "pipe", "pipe"] });
|
||||
let err = "";
|
||||
p.stderr.on("data", (d) => (err += d));
|
||||
p.stdout.on("data", () => {});
|
||||
p.on("close", () => resolve(err));
|
||||
});
|
||||
}
|
||||
|
||||
const psnr = await ff(["-i", a, "-i", b, "-lavfi", "psnr", "-f", "null", "-"]);
|
||||
const ssim = await ff(["-i", a, "-i", b, "-lavfi", "ssim", "-f", "null", "-"]);
|
||||
const yavg = await ff([
|
||||
"-i", a, "-i", b,
|
||||
"-lavfi", "blend=all_mode=difference,signalstats,metadata=print:key=lavfi.signalstats.YAVG",
|
||||
"-f", "null", "-",
|
||||
]);
|
||||
|
||||
const num = (text, re) => {
|
||||
const m = text.match(re);
|
||||
return m ? Number(m[1]) : NaN;
|
||||
};
|
||||
|
||||
const yavgs = [...yavg.matchAll(/YAVG=([\d.]+)/g)].map((m) => Number(m[1]));
|
||||
|
||||
const report = {
|
||||
psnr_avg: /average:inf/.test(psnr) ? Infinity : num(psnr, /average:([\d.]+)/),
|
||||
ssim_all: num(ssim, /All:([\d.]+)/),
|
||||
mean_abs_diff: yavgs.length ? yavgs[yavgs.length - 1] : NaN,
|
||||
};
|
||||
|
||||
console.log(`psnr=${report.psnr_avg} dB ssim=${report.ssim_all} mean|diff|=${report.mean_abs_diff}/255`);
|
||||
|
||||
if (outPng) {
|
||||
await ff(["-y", "-i", a, "-i", b, "-lavfi", "blend=all_mode=difference", "-frames:v", "1", outPng]);
|
||||
console.log(`diff image -> ${outPng}`);
|
||||
}
|
||||
Reference in new issue
Block a user