WebP + Alpha stealth metadata corrupts RGBA images since the ImageMagick swap

在 SwarmUI 中把已经带 Alpha 通道的 8-bit sRGB RGBA 图像转换为 WebP 并开启 stealth metadata("Alpha")时,像素会被破坏。优先排查 ImageMagick 像素缓存的共享/分离行为差异,以及扩展调用 ConvertTo 的方式。

快速结论:在 SwarmUI 中把已经带 Alpha 通道的 8-bit sRGB RGBA 图像转换为 WebP 并开启 stealth metadata(”Alpha”)时,像素会被破坏。优先排查 ImageMagick 像素缓存的共享/分离行为差异,以及扩展调用 ConvertTo 的方式。

适用环境:Issue 已确认涉及 SwarmUI、SeedVR2 扩展、ImageMagick(在 SwarmUI 换用 ImageMagick 之后出现)以及 ConvertTo("WEBP_LOSSLESS", metadata, stealthMetadata: "Alpha") 这个特定的转换流程;正文未提供操作系统、Python、CUDA、显卡或具体版本号。

最快修复方案:暂无确认的一步修复方案。Issue 的评论只写了“fixed”,没有公开具体的改法,因此不要把正文里的 Possible fix 当成已经验证过的修复方法。

注意事项:Issue 正文中的 Possible fix 是报告者推测的代码方案,其中涉及 MetadataHelper.cs 的内部实现细节,不能直接作为用户侧的修复步骤。PNG + Alpha、不带 stealth 的 WebP 以及 RGB 源图在 Issue 中都没有出现该问题,可以先用这些组合做对照,确认问题是否只出现在 WebP + Alpha stealth 这一条路径上。

问题场景

用户更新 SeedVR2 扩展时,对一张已经是 8-bit sRGB TrueColorAlpha 的图像调用 ConvertTo("WEBP_LOSSLESS", metadata, stealthMetadata: "Alpha"),得到的 WebP 输出几乎每一个像素都被打乱。Issue 用一张 256px 带 Alpha 通道的照片复现了这个现象:40960 个像素中有 40939 个出错,最大通道差值为 255。同一条路径下,PNG + Alpha 以及不带 stealth 的 WebP 都正常,RGB 源图也正常。

报错原文

WebP + Alpha stealth metadata corrupts RGBA images since the ImageMagick swap

Issue 说明这个过程中没有产生错误日志,属于图像内容被静默破坏。

原因分析

可能原因(以 Issue 正文的分析为准):ConvertTo 在 ToMagickFrames.Clone() 出来的副本上操作,而这个 clone 与原始图像共享同一个像素缓存(pixel cache)。当图像本身已经是 TrueColorAlpha 时,EncodeStealthMetadata / PrepareImageForWebPAlpha 中对 ColorType 的赋值不会产生实际效果。于是 PrepareImageForWebPAlpha(MetadataHelper.cs:94)里第一次逐像素写入就落在共享缓存上,ImageMagick 随后把 clone 分离到一个新的缓存,却没有把像素拷贝过去。之后 ToByteArray(PixelMapping.RGBA)(MetadataHelper.cs:78)读到的就是未初始化内存,再由第 87 行的 SetPixels 写出。

环境排查

  • 确认 SwarmUI 是否运行在换用 ImageMagick 之后的版本上;Issue 标题明确指出问题是在这次替换之后出现的。
  • 确认触发转换的源图是否已经带 Alpha 通道,且为 8-bit sRGB TrueColorAlpha;只有这个类别被确认会出问题。
  • 确认调用参数是否为 WEBP_LOSSLESS 加 stealthMetadata: "Alpha";去掉 stealth metadata 后输出正常的现象已经在 Issue 中得到确认。
  • 确认是否经 SeedVR2 扩展或其他扩展间接调用该转换,因为报告者的复现起点就是更新 SeedVR2 扩展时。
  • Issue 没有给出 ImageMagick、SwarmUI 的具体版本号,也没有提到操作系统、Python、CUDA 或显卡,因此这些项目无法用来缩小范围。

解决步骤

  1. 先按 Issue 的复现方式做对照:用同一张带 Alpha 的源图,分别输出 PNG + Alpha、WebP(不带 stealth)和 WebP + Alpha stealth。如果只有最后一种出现像素错乱,就可以把问题范围缩小到这条特定的转换路径。
  2. 在问题修复之前,可以优先尝试绕开该组合:要么改用 PNG + Alpha,要么在输出 WebP 时不带 stealth metadata。这两种做法在 Issue 中都被确认是正常的。
  3. 如果必须使用 WebP + Alpha stealth,可以关注 SwarmUI 在 2026-11-08 关闭该 Issue 之后发布的包含修复的版本,因为评论中只说明已经修复,没有给出公开的代码改动细节。
  4. 不要直接把 Issue 正文里的 Possible fix 当作操作步骤;其中提到的“在 SetPixels 之前直接在 data 的右边缘列写入 alpha 254”属于源码层面的推测性修改,需要由维护者在 MetadataHelper.cs 中落实。

验证方法

按复现步骤重新生成输出文件,用 new MagickImage(outFile.RawData) 的 RGB 与原始 file.ToMagick 逐像素比较。如果不再出现近乎全图范围的通道差异(Issue 中 40960 个像素里有 40939 个出错),就可以认为问题已经解决。同时可以抽查输出是否带有预期的 stealth metadata。

参考来源

mcmonkeyprojects/SwarmUI #1590

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 33566

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注