SDXL 渲染或 inpaint 合成完,输出在高对比边缘有块状 8x8 JPEG 伪影、渐变区(尤其天空和皮肤)出现可见色阶带、阴影区有颜色量化。50% 缩放预览看不出来,100% 一看就崩。原因通常是两层叠加:VAE 解码引入了 fp16 位深错误(SDXL 默认 VAE 这个毛病很出名),再加上有损 JPEG 导出对本已脆弱的输出又压了一次。
最快修法: 换成 madebyollin/sdxl-vae-fp16-fix 这个 VAE,最终图导出用 PNG 而不是 JPEG。这一下同时干掉两个根因,能解决绝大多数情况。后面的步骤是给”换了还在”、“必须用 JPEG”、或”接缝沿着 inpaint mask 走”这几种残留情况准备的。
先确认你属于哪一类
在左列找到你的症状,对上判断依据,再跳到对应步骤。
| 你看到的症状 | 确认的判断依据 | 真正原因 | 跳到 |
|---|---|---|---|
| 天空/皮肤有色阶带、有色洞,只在 SDXL | 同工作流换 SD 1.5 就干净 | fp16 VAE NaN bug | Step 1 |
| 每条锐边都有 8x8 网格 | 100% 缩放能看到、是规则方块阵 | JPEG quality 80 以下 | Step 2 |
| 只有红蓝边缘糊、绿白边缘锐 | 口红、霓虹、夕阳糊且偏移 | 4:2:0 色度子采样 | Step 3 |
| 源图本来没有、放大后才出现的伪影 | 原分辨率干净,放大引入 | 放大了有损输入 | Step 4 |
| 接缝完全沿着 mask 形状走 | 轮廓和你的 inpaint 选区吻合 | inpaint denoise/mask 不匹配 | Step 5 |
如果两行都对得上,从上往下修。Step 1 加 Step 2 一起就能解决大部分反馈。
最短修复路径
Step 1:换 SDXL VAE
原版 SDXL VAE 在 fp16 下会溢出,因为它内部激活值太大;在 fp16 GPU 上就会产生 NaN 像素,表现为色阶带、色洞、边缘乱码。社区的修法是 madebyollin/sdxl-vae-fp16-fix,这是一个经过微调、在 fp16 下不溢出的 VAE。它基于 SDXL-VAE 0.9,但同样适用于 SDXL 1.0,附带好处是解码更快、显存占用比跑 fp32 更低。
从 Hugging Face 下载(madebyollin/sdxl-vae-fp16-fix)。仓库主文件名是 sdxl.vae.safetensors,你可以保留这个名字,也可以改成一眼能认的 sdxl-vae-fp16-fix.safetensors。放进你工具的 VAE 目录:
Automatic1111: stable-diffusion-webui/models/VAE/
ComfyUI: ComfyUI/models/vae/
Forge: webui/models/VAE/
然后显式选它,不要选 “Automatic” 或 checkpoint 的 “Baked VAE”:
- Automatic1111 / Forge: Settings > Stable Diffusion > “SD VAE” 下拉里选这个文件。如果列表里没有,点下拉旁边的刷新图标(A1111 和 Forge 只在启动时扫一次文件夹)。
- ComfyUI: 加一个
Load VAE节点,从下拉里选这个文件,把它的VAE输出接到VAEDecode节点,覆盖 checkpoint 的内置 VAE。下拉只列models/vae/里的文件,且文件名区分大小写。 - Diffusers:
vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16),再传给你的 pipeline。
用同 Prompt 同 seed 重跑,色阶带和边缘伪影应该立刻消失。
如果实在用不了 fp16-fix,退一步把 VAE 解码切到 fp32:在 Automatic1111 / Forge 的启动参数里加 --no-half-vae。慢一点、显存占用更高,但稳。
Step 2:导出改 PNG,别用 JPEG
最终交付、任何对画质有要求的场景,用无损格式。PNG 永远不会出现 JPEG 方块伪影:
Automatic1111: Settings > Saving images/grids > "File format for images": png
ComfyUI: Save Image 节点(默认输出就是 PNG)
Photoshop: File > Export > Export As > PNG
Affinity: File > Export > PNG
文件大约是 JPEG 的 3-5 倍,但 1024x1024 这个体积完全无所谓。如果 2026 年你需要给网页用、又想要接近无损画质的更小文件,无损 WebP 或近无损 AVIF 比 PNG 更省体积,同样不会出 8x8 方块(见 Step 3)。
Step 3:必须 JPEG(或网页上传)时,quality 拉到 95+ 并关掉色度子采样
如果必须用 JPEG(文件大小上限、邮件、只收 JPEG 的 CMS),对色彩边缘来说,色度子采样这个开关比 quality 滑块更关键。标准 JPEG 在 quality 100 以下用 4:2:0,把颜色按一半分辨率存,会糊掉饱和的红蓝边缘。强制 4:4:4(不做子采样):
Photoshop: File > Export > Save for Web (Legacy) > JPEG,Quality 95+,勾 "Progressive"
(Save for Web 在 quality 51 及以上会输出 4:4:4)
Affinity: Export > JPEG > Quality 95,"Chroma subsampling" 设为 None / 4:4:4
ImageMagick: magick input.png -quality 95 -sampling-factor 4:4:4 output.jpg
(旧版本用 legacy 命令:convert input.png -quality 95 -sampling-factor 1x1 output.jpg)
Squoosh: MozJPEG,Quality 92-95,"Chroma subsampling" 设为 4:4:4
说明:-sampling-factor 1x1 和 4:4:4 是一回事(都是不做子采样);较新的 ImageMagick 7 推荐用 magick 命令,也接受 4:4:4 写法。如果目标平台允许,直接导 WebP(quality 90+)或 AVIF 能彻底绕开 JPEG 的 8x8 方块、文件还更小,这是 2026 年比死磕 JPEG quality 更干净的做法。
Step 4:小图渲染、大图放大、降采样交付
放大一个有损或低细节的输入,会把它本来的伪影放大。先在原分辨率干净渲染,放大,再降采样到交付尺寸,让最后一次重采样把残留噪点平均掉:
渲染: 1024x1024(无损、在内存里)
放大: 用保颗粒的模型 4x(如 4x_NMKD-Siax)升到 4096x4096
降采样: Lanczos/area 降到目标尺寸(1920x1920 或 1080x1080)
导出: PNG,或 quality 95、4:4:4 的 JPEG
永远不要放大已经导出的 JPEG;要放大的是无损的渲染图或 latent,不是重压过的文件。
Step 5:软化 inpaint mask 边缘
如果伪影完全沿着你的 inpaint 选区轮廓走,那是 denoise/mask 接缝,不是 JPEG。把过渡拉宽、把 denoise 调低,让新区域融进周围纹理:
Mask blur: 8-16 像素(默认常是 2-4)
Mask padding: 32 像素
Inpaint denoise: 约 0.4(0.6+ 改动太大、破坏融合)
Inpaint area: 融合用 "Whole picture",外科手术式修补用 "Only masked"
更宽的 mask blur 让 denoise 梯度过渡更长,藏住接缝。
怎么确认修好了
- 用 100%(1:1)缩放打开最终文件,不是看实时预览。
- 检查一处渐变(天空、脸颊、柔和阴影):应该平滑过渡,没有阶梯状色带。
- 检查一条硬的饱和边缘(嘴唇、霓虹招牌、天空与建筑的亮边界):没有 8x8 网格、没有色边或渗色。
- 如果导的是 JPEG,重新打开保存后的文件(不是编辑器画布)再看一遍,因为伪影是保存那一刻产生的,不是你保存前看到的样子。
- 进阶精确检查:把源 PNG 和导出的 JPEG 叠成两层,把上层混合模式设为 “Difference”,再拉一下色阶。边缘出现成片的亮色方块,说明 JPEG 设置还需要调。
预防建议
- 把
sdxl-vae-fp16-fix设成 SDXL 默认 VAE;SDXL 永远别信 checkpoint 内置的那个。 - Automatic1111 / Forge 默认导出格式设成 PNG,只在单图导出时切 JPEG。
- 在乎画质的 AI 图,永远不要走 Twitter/X、Facebook、WhatsApp 二次上传,它们会重压到大约 quality 70-80、4:2:0。
- 客户交付同时给 PNG 母版和 JPEG quality-95(或 WebP)预览。
- 养成习惯:出货前用 100% 缩放检查保存后的文件。
常见问题
这是我模型的问题还是显卡的问题? 其实都不是。fp16 NaN 是原版 SDXL VAE 的数学在 fp16 下溢出导致的,在大多数消费级显卡跑 fp16 时都会出现。换 VAE(Step 1)就能修,不用动 checkpoint 也不用换硬件。
换了 fp16-fix VAE 之后颜色略有不同,正常吗?
正常。这个修复是微调版,输出和原版 VAE 有细微差异。差异很小,而且远好过 NaN 色阶带。如果你需要和原版完全一致的输出,改用 --no-half-vae(fp32 解码)。
我已经导 PNG 了还是有色阶带,怎么办? 那就不是导出的问题,是 Step 1(VAE)或 Step 5(inpaint 接缝)。PNG 只排除了 JPEG 方块伪影。用 fp16-fix VAE 重跑,再 100% 检查。
为什么图在编辑器里好好的,导出 JPEG 后就坏了? JPEG 伪影是在压缩那一刻产生的。编辑器给你看的是未压缩的画布,损伤只出现在写出的文件里。判断画质永远要重新打开保存后的文件。
是不是干脆用 WebP 或 AVIF,别折腾 JPEG? 如果目标平台支持,那就用。截至 2026 年 6 月,两者都不会出 8x8 方块,文件还比 quality 95、4:4:4 的 JPEG 更小。但无论如何都保留一份 PNG 母版。
放大能修掉已有的 JPEG 伪影吗? 不能,放大只会放大它们。先把源修干净(Step 1-3),再放大干净的渲染图,最后降采样到交付尺寸(Step 4)。
相关阅读
- AI 图片缺胶片颗粒:5 步还原真实摄影质感
- AI 图片细节不足怎么救回锐度
- AI 图片背景颜色渗到主体上:4 步隔离法
- AI 图片过 CG 化怎么拉回自然质感
- AI 图片皮肤过于光滑像塑料:4 步还原真实质感
- AI 图片自带水印或假签名:5 类原因 + 6 步修复路径
- AI 图片文字错语种或乱码:5 步出可读招牌
外部参考:
标签: #ai-image #排查 #postprocess #vae