摄影与 CMS 已大量收 AVIF,但游戏素材、旧 CMS、印前或设计验收仍点名 PNG。本文给设计师与前端一份可执行的决策矩阵:用哪条解码链、如何把量化与色深落到8-bit sRGB、透明怎么锁PNG32,以及如何在远程 Mac mini M4 上用体积阈值(字节)替代群聊拍脑袋。总策略请先对齐 WebP / AVIF 与 PNG 混排交付清单;与 WebP 升格对照可参阅 WebP→PNG 矩阵。
工具链选型:libavif、ffmpeg、ImageMagick 怎么选
原则:批量默认一条主路径,另备一条对照路径处理「坏容器」;所有路径写进 README,避免每人本地版本不同导致色差。
| 路径 | 适用场景 | 要点 |
|---|---|---|
libavif avifdec |
生产批处理首选;需与上游同一 libavif 大版本族 | avifdec input.avif -o out.png;对 alpha 与 CICP 行为相对可预期。安装:brew install libavif |
| ffmpeg(libaom-av1 / libdav1d) | 异常文件、需从序列或怪异容器抽帧 | ffmpeg -y -i input.avif -pix_fmt rgba frame.png;检查构建是否含 AV1 解码(ffmpeg -decoders | grep av1) |
ImageMagick 7 magick |
解码后立刻做色彩归一、合成抽检图 | magick input.avif -colorspace sRGB PNG32:handoff.png;透明素材勿静默落成 PNG24 |
与广色域、标签策略相关的门禁请同步 sRGB 与 Display P3 导出验收清单,避免「屏上好看、标签不对」的争议。
在 远程 M4 上可把目录拆成多段并行(例如按首字母哈希子目录),用 flock 或独立 work 子树避免同名竞态;磁盘预留 ≥ 源体积 3× 峰值,防止 NVMe 写满导致解码半截文件。
| AVIF 母带类型 | 推荐 PNG 路径 | 主要风险 |
|---|---|---|
| 无损或近无损 + alpha | avifdec → magick 归一 → PNG32 |
体积显著大于 AVIF——提前在 CDN 合同里写 max_bytes |
| 有损 420 + 细线 UI | 可解码,但彩边常在源里;优先让上游改 444 或给矢量 | 高——转 PNG 无法「修复」已丢的高频 |
| 动画 AVIF | 动效单独 SKU;静帧 PNG 只覆盖其中一帧合同 | 误把序列当单图交付 |
色彩与透明处理参数表
| 源信号 | PNG 合同动作 | 建议命令片段 |
|---|---|---|
| 8-bit,sRGB 或缺失 ICC,需 Web 交付 | 输出 8-bit;嵌入 sRGB IEC61966-2.1 或按项目统一剥离并在 README 声明 |
magick in.avif -depth 8 -colorspace sRGB PNG32:out.png |
| 10-bit / BT.2020 PQ 或 HLG | 若无 HDR→SDR 书面许可,拒收或要求重导出 SDR 母带;许可则显式色调映射后再压 8-bit | 禁止仅 -define png:exclude-chunk=iCCP 式「去标签」冒充合规 |
| 有损 YUV420 + alpha | 解码为 PNG32;检查彩边与脏透明 | magick identify -verbose out.png | egrep 'Type|Colorspace|Alpha|icc' |
体积超 max_bytes |
在评审纪要的质量带内 pngquant;更大则回退改源或调 SKU |
pngquant --quality=70-85 --speed 1 --skip-if-larger -f -o q.png out.png |
抽检底色与 WebP 页保持一致:#FFFFFF 与 #0B0D12 上叠图看软边;光晕即批次失败。
批量脚本步骤与失败重试
在 远程 M4 上为 in/avif 挂载专用队列;每批写 manifest.jsonl(源路径、sha256、解码器版本、pass/fail)。下面为最小 bash 骨架:失败入 quarantine/,指数退避最多 5 次,避免 thundering herd。
#!/usr/bin/env bash
set -euo pipefail
IN="${1:-in/avif}"; OUT="${2:-out/png}"; QUAR="quarantine"; mkdir -p "$OUT" "$QUAR"
max_attempts=5; base_delay=2
for f in "$IN"/*.avif; do
[[ -e "$f" ]] || continue
b="$(basename "$f" .avif)"; dest="$OUT/${b}.png"; attempt=1; ok=0
while (( attempt <= max_attempts )); do
if avifdec "$f" "$dest.tmp" 2>/dev/null && magick "$dest.tmp" -colorspace sRGB PNG32:"$dest"; then
rm -f "$dest.tmp"; ok=1; break
fi
sleep $(( base_delay ** (attempt - 1) ))
((attempt++)) || true
done
if (( ok != 1 )); then mv -f "$f" "$QUAR/" 2>/dev/null || true; echo "{\"file\":\"$f\",\"reason\":\"decode_fail\"}" >> manifest.jsonl; fi
done
说明:avifdec 直接写 PNG 时若色彩不符合合同,可改为 RAW 或临时无损 TIFF 再经 magick 归一,以免双次有损。单文件对照:ffmpeg -y -i "$f" -pix_fmt rgba "${b}_ff.png" 与主路径 diff。
字节门槛示例(与 WebP 页同一口径):长边 ≤1600 px 的常见带:≤350 KB(精简)、≤800 KB(标准)、≤1.6 MB(主视觉)——写进合同后执行:
test "$(stat -f%z "$dest")" -le 800000 || { echo "OVER max_bytes $dest" >> manifest.jsonl; mv "$dest" "$QUAR/"; }
与设计导出目录联动的验收阈值
建议目录契约(与 Figma / Sketch 导出脚本对齐):
export/avif/:设计工具或插件落盘,只读入队。work/png/:解码与 magick 中间件,可清空重建。deliver/png/:通过max_bytes、identify类型与合成抽检后的唯一晋升目录。
| 验收项 | 阈值 / 命令 | 失败处理 |
|---|---|---|
| 几何 | 与规格 WxH ±0 px(除非书面允许缩放) | reason_code=geometry → quarantine/ |
| 字节 | stat -f%z ≤ 合同 max_bytes |
尝试 pngquant 带;仍超则升级 SKU 或拒收母带 |
| 类型 | 有 alpha 须报告 TrueColorAlpha 或等价;禁静默调色板除非合同允许 | magick identify -format '%[type]\n' "$dest" |
| 溯源 | JSONL 含 sha256、avifdec -V、magick -version 首行 |
缺字段整批不得合并到主分支 |
下一步:把 AVIF→PNG 交给稳定工作机
打开 MacPng 首页,在 购买 / 租用 选择远程 Mac 套餐,查看 价格与节点,并按 帮助中心 接入 SSH;夜间让 M4 跑满解码与 stat 门槛,白天只做抽检与合流。更多矩阵见 技术见解。