AI 图片边缘 JPEG 伪影怎么消除:5 步导出干净版

SDXL 渲染或 inpaint 后边缘出现块状 8x8、渐变带状。真正根因是 fp16 VAE 加上有损导出。换 fp16-fix VAE 并改导 PNG。

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 bugStep 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 1x14: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 梯度过渡更长,藏住接缝。

怎么确认修好了

  1. 用 100%(1:1)缩放打开最终文件,不是看实时预览。
  2. 检查一处渐变(天空、脸颊、柔和阴影):应该平滑过渡,没有阶梯状色带。
  3. 检查一条硬的饱和边缘(嘴唇、霓虹招牌、天空与建筑的亮边界):没有 8x8 网格、没有色边或渗色。
  4. 如果导的是 JPEG,重新打开保存后的文件(不是编辑器画布)再看一遍,因为伪影是保存那一刻产生的,不是你保存前看到的样子。
  5. 进阶精确检查:把源 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-image #排查 #postprocess #vae