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。
50 lines
1.7 KiB
JavaScript
50 lines
1.7 KiB
JavaScript
// 两张 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}`);
|
|
}
|