先把它从图片里找出来
下面两张图截取的是原图左侧同一块 96×96 像素区域,并按相同比例放大。 左边能看到绿色背景和红色角色轮廓;右边不看颜色内容,只看 Alpha 通道最低位的变化。
右图不是把原图压暗,而是把 Alpha 通道单独提取出来,再把细微差异映射成热力颜色。 可以很清楚地看到,变化沿着最左侧排列,其他位置没有变化。图中按 3×3 像素汇总显示,避免把原文件的逐像素数据直接公开。
隐藏区域并不总在左侧。它会随着图片尺寸、数据长度和写入顺序改变。 这组图要说明的是:画面看着完全正常,Alpha 通道里仍然可以装着另一份数据。
它和普通元数据有什么区别?
理解“为什么删了元数据仍可能留下信息”,要先把一张 PNG 看成三个不同层次:
可见画面红、绿、蓝三个通道组成我们看到的颜色。
文件级元数据EXIF、XMP、tEXt、iTXt、C2PA 等独立数据块。
像素级隐藏信息stealth_pngcomp 把数据写进 Alpha 通道最低位,属于像素本身。
常规“清除元数据”通常针对第二层。如果工具原样保留 RGBA 像素,第三层就可能跟着新文件一起保留下来。
254 和 255,为什么能拿来藏数据?
8-bit PNG 的每个通道取值为 0—255。对 Alpha 来说,255 是完全不透明;254 只少一个等级。 二者的二进制表示只差最后一位:
11111111可表示 111111110可表示 0这最后一位就是最低有效位(LSB)。程序依次读取许多像素的 LSB,便能把 0 和 1 重新拼成字节; 人眼看到的透明度差异却几乎为零。这也是右侧热力图必须把差异大幅放大后,位置才变得明显的原因。
这些 0 和 1 里面装的是什么?
按照 NovelAI 公开实现,读取过程可以概括为一条连续链路:
- 1
识别格式读取固定标记
stealth_pngcomp,确认数据类型。 - 2
确定长度读取长度字段,知道后续应该取多少隐藏位。
- 3
解压内容把二进制还原为字节并用 gzip 解压,最终得到结构化 JSON。
JSON 中可能包含正向与反向提示词、Seed、Steps、Sampler、CFG、模型或软件信息,以及签名相关字段。 所以它不是“加密后看不懂的水印图案”,而是被藏起来的一份生成记录。
为什么普通清理工具可能漏掉它?
只移除 EXIF、XMP、PNG 文本块,随后无损保存原始 RGBA 像素。
去除 Alpha、重建 Alpha、缩放重采样,或转成不支持 Alpha 的 JPEG。
平台重新编码、滤镜和调色也可能改变最低位,但“可能破坏”不等于“已经验证清除”。可靠的处理流程应明确重建相关像素, 再用独立检测器复查,而不是只看文件属性里有没有 EXIF。
stealth_pngcomp 隐蔽、容量大,却依赖像素最低位保持不变;缩放和有损编码很容易让数据失效。
发现 stealth_pngcomp,就能认定来自 NovelAI 吗?
不能只凭格式下结论。stealth_pngcomp 的结构已经公开,第三方也能写入相同格式。 “检测到隐藏数据”只能说明文件中存在符合该结构的内容。
signed_hash 是另一层判断:stealth_pngcomp 回答“数据藏在哪里”,签名验证回答“图片与相关元数据能否通过来源校验”。 如果要做较严格的归因,应把格式、解码内容和数字签名验证结合起来,而不是把其中任何一项当作绝对证明。
这个站目前能查到什么?
当前工具除了检查和清理 EXIF、GPS、XMP、PNG 文本信息、C2PA 和常见 AI 生成参数, 也会读取 Alpha-LSB 中的 stealth_pngcomp,展示可解析的提示词、Seed、采样器等字段。
使用 图片元数据清理工具清理时,工具会重建 Alpha 最低位载体并在导出前复查, 同时清除普通文件级元数据。处理只在浏览器本地完成。
普通元数据在“文件块”里,stealth_pngcomp 在“像素 Alpha 最低位”里。位置不同,检测和清理方法也不同。
参考资料
本文原理依据 NovelAI 官方公开的图片元数据项目整理,其中包含 Alpha 通道隐藏元数据的读取、写入和签名验证实现。