SDXL 渲染或 inpaint 合成完,发现输出在高对比边缘有块状 8x8 JPEG 伪影、渐变区(天空、皮肤)出现可见的色阶带、阴影区有颜色量化。50% 缩放预览看不出来,100% 一看就崩。原因通常是两层叠加:VAE 解码引入了位深问题(尤其是 SDXL 默认的 fp16 VAE)、再加上 JPEG 导出对已经脆弱的输出再压一次。
修法:换一个更稳的 VAE(SDXL fp16-fix 或 0.9.fp32)、高质量场景一律导 PNG、必须用 JPEG 时 quality 拉到 95+ 并关掉色度子采样。
常见原因
按命中率从高到低:
1. SDXL 默认 fp16 VAE 的 NaN bug
原版 SDXL VAE 在 fp16 GPU 上会在部分像素产生 NaN,表现为色阶带、色洞、边缘伪影。这是一个已知 bug,Hugging Face 上的 sdxl-vae-fp16-fix 修了它。
如何判断:只在 SDXL 出问题,SD 1.5 同样工作流正常。色阶带集中在天空、渐变、阴影区。
2. JPEG 导出 quality 80 以下
很多工具默认(Photoshop “Save for Web” 中等、Telegram、Twitter)会把图重新压到 70-80。每条边缘都会产生 8x8 方块伪影。
如何判断:100% 看任意一条锐边,能看到 8x8 网格图案就是 JPEG 量化。
3. 色度子采样 4:2:0
大多数 JPEG 默认用 4:2:0 色度子采样,把颜色通道分辨率砍半。红蓝边缘(口红、霓虹、夕阳)特别容易糊和漂移。
如何判断:红蓝边缘糊且偏移、绿白边缘锐利。
4. 合成前先放大
如果你把低质量 JPEG 放大后再贴进渲染(或合成两张渲染),放大器会把伪影放大。
如何判断:源图原分辨率没伪影,放大后才出现。
5. inpaint mask 边缘不匹配
硬边 inpaint mask 在重绘区域和原图交界处会留下可见接缝。看着像 JPEG 边缘,实际是 denoise 不匹配。
如何判断:伪影完全沿着你的 inpaint mask 形状走。
最短修复路径
Step 1:换 SDXL VAE
从 Hugging Face 下载 sdxl_vae_fp16_fix.safetensors(stabilityai/sdxl-vae 或 madebyollin/sdxl-vae-fp16-fix),放到:
Automatic1111: stable-diffusion-webui/models/VAE/
ComfyUI: ComfyUI/models/vae/
Forge: webui/models/VAE/
工作流里显式选这个 VAE,不要选 “automatic” 或 “Baked VAE”。同 Prompt 重跑——色阶带和边缘伪影应该立刻消失。
如果实在用不了 fp16-fix,退一步把 VAE 解码切到 fp32(Automatic1111 加 --no-half-vae)。慢一点但稳。
Step 2:导出改 PNG,别用 JPEG
最终交付、任何对画质有要求的场景:
Automatic1111: Settings > Saving images > File format: png
ComfyUI: 用 Save Image 节点,默认就是 PNG
Photoshop: File > Export > Export As > PNG (24-bit)
Affinity: File > Export > PNG
PNG 无损。永远不会出现 JPEG 方块伪影。文件大 3-5 倍,但 1024x1024 这个体积完全 OK。
Step 3:必须 JPEG 时 quality 拉到 95+
网页上传限制、邮件这类必须 JPEG 的场景:
Photoshop: File > Export > Save for Web > JPEG Quality 95+,chroma "4:4:4 progressive"
Affinity: Export > JPEG > Quality 95,"No chroma subsampling"
ImageMagick CLI: convert input.png -quality 95 -sampling-factor 1x1 output.jpg
Squoosh.app: MozJPEG, quality 92, 关闭色度子采样
色度子采样这个开关比 quality 滑块对色彩伪影影响更大。
Step 4:高分辨率出图再降采样
先 1024x1024 渲染,用保颗粒的放大器升到 2048 或 4096,再降采样到交付尺寸:
渲染: 1024x1024
放大: 4x_NMKD-Siax 升到 4096x4096
降采样: 双线性降到目标尺寸(1920x1920 或 1080x1080)
导出: PNG 或 JPEG quality 95
降采样能把放大残留的小伪影平均掉。
Step 5:软化 inpaint mask 边缘
如果伪影沿着 inpaint mask 走:
Mask blur: 8-16 像素(之前 2-4)
Mask padding: 32 像素
Inpaint denoise: 0.4(比 0.6+ 更容易和周围纹理对齐)
"Inpaint area":融合用 "whole picture",外科手术式修补用 "Only masked"
更宽的 mask blur 让 denoise 梯度过渡更长,藏住接缝。
预防建议
- SDXL 默认 VAE 永远用 sdxl-vae-fp16-fix,别信内置的
- Automatic1111 / Forge 默认导出格式设成 PNG,只在单图导出时切 JPEG
- 在乎画质的 AI 图永远不要走 Twitter / Facebook / WhatsApp 二次上传,它们都会重压
- 客户交付永远同时给 PNG(母版)和 JPEG quality 95(预览)
- 养成习惯:每张最终图出货前先 100% 缩放检查一遍
相关阅读
- AI 图片缺胶片颗粒:5 步还原真实摄影质感
- AI 图片细节不足怎么救回锐度
- AI 图片背景颜色渗到主体上:4 步隔离法
- AI 图片过 CG 化怎么拉回自然质感
- AI 图片皮肤过于光滑像塑料:4 步还原真实质感
- AI 图片自带水印或假签名:5 类原因 + 6 步修复路径
- AI 图片文字错语种或乱码:5 步出可读招牌
标签: #ai-image #排查 #postprocess #vae