“能不能还原”通常不是运气问题,而是尺寸、格式和压缩过程有没有被改变的问题。 这一页把本站与参考算法对齐的参数列出来,也把常见的失败原因按可能性排序。
互通需要三个条件
只要满足下面三条,用参考实现混淆的图片就可以直接在本站还原,反过来也一样:
- 宽高完全一致。不是“看起来差不多”,而是像素级相同。少一个像素,曲线形状和步长都会变。
- 使用同一套曲线与位移规则。也就是 Gilbert 曲线遍历,加上约 0.618 倍总像素的循环位移。
- 像素没有被重新采样。裁剪、缩放、旋转、截图、聊天软件压缩都可能改变像素位置或尺寸。
本站的曲线生成、位移公式、像素搬运方向都与公开参考实现一致。实现上把逐字节复制改成了 32 位整字复制,并把坐标数组换成了扁平的类型化数组,但顺序与结果不变。
参数逐项对齐
| 项目 | 取值 | 备注 |
|---|---|---|
| 曲线 | 广义 Hilbert / Gilbert | 支持任意宽高矩形,不要求 2 的幂次。 |
| 步长 | round((√5 − 1) / 2 × W × H) | 四舍五入,整数。 |
| 混淆 | 第 i 点写入第 i + shift 点 | 循环取模。 |
| 解混淆 | 第 i 点读取第 i + shift 点 | 方向相反,参数相同。 |
| 通道 | RGBA 四字节整体搬运 | 透明度也参与重排,不会被单独保留。 |
| 像素上限 | 8,000,000 | 超出时等比缩小。 |
| 单边上限 | 4,000 像素 | 长边或短边任一超出都会缩放。 |
| 默认导出 | JPEG,质量参数 1 | 仍属于有损编码,但压缩程度最低。 |
这里的“质量 1”是浏览器 toBlob 接口的质量参数,不是“无损”的同义词。
不同浏览器对 JPEG 编码器的实现不同,即使参数相同,输出字节也可能不同。
如果你需要严格的像素往返,请使用 PNG。
尺寸上限怎么算
单张图片同时受两条约束:总像素不超过 800 万,单边不超过 4000 像素。 触发任意一条,就会按比例缩小,缩放比例取三个候选值中最小的那个:
scale = min(
sqrt(8,000,000 / (W × H)),
4000 / W,
4000 / H,
1
)
举几个具体例子:
- 4000 × 2000:单边正好 4000,总像素 800 万,刚好在上限内,不缩放。
- 3264 × 2448:约 799 万像素,不缩放。
- 6000 × 4000:总像素 2400 万,单边 6000,会缩到 4000 × 2667 左右。
- 2000 × 6000:单边 6000,总像素 1200 万,会缩到 1333 × 4000。
缩放使用浏览器的高质量插值,不会拉伸变形。页面会在图片下方提示原始尺寸和缩小后的尺寸。 被缩小的图片仍能正常混淆,但不能再与“原始尺寸混淆图”互通。
JPG 与 PNG 的取舍
| 维度 | JPG | PNG |
|---|---|---|
| 压缩方式 | 有损 | 无损 |
| 文件体积 | 小 | 大,尤其是噪点多的混淆图 |
| 透明通道 | 不支持,铺白底 | 保留 |
| 反复往返 | 会累积压缩痕迹 | 不产生额外损失 |
| 兼容性 | 最广 | 现代浏览器与聊天软件均支持 |
| 推荐场景 | 一次性分享、体积敏感 | 需要还原、多次处理、保留透明 |
一个常见的误解是“JPG 质量 1 就等于无损”。实际上它仍然会做颜色采样和量化, 只是程度最低。混淆图本身就是高频噪点,JPG 编码器在这类内容上更容易产生块状痕迹。 如果你在意还原后的细节,请从源头选择 PNG。
透明、动图与旋转
读取时,工具会把透明通道当作普通字节一起重排。这对可逆性没有影响,但导出 JPG 时会铺白底, 透明信息就丢失了。需要保留透明,请使用 PNG 输出。
动图(GIF、动态 WebP)经过 Canvas 后只保留第一帧,输出为静态图。 这不是缺陷,而是 Canvas 绘制模型的限制;如果需要对每一帧处理,需要逐帧导出再重新合成。
手机拍摄的照片可能带有 EXIF 方向信息。现代浏览器在绘制到画布时会按方向信息自动旋转, 因此你看到的宽高可能已经与文件头记录的不同。处理前请以工具显示的宽高为准, 并确保发送方与接收方使用同一份文件。
另外,Canvas 导出通常不会保留原始的 ICC 色彩配置。广色域图片在浏览器里可能出现轻微色差, 这不影响像素顺序的可逆性,但如果你对颜色准确性要求很高,建议先在专业软件里转换到 sRGB, 再进行比较或归档。
还原失败的六种原因
- 图片被缩放。聊天软件的“压缩发送”、社交平台的自动缩放、网页上传限制都会改变宽高。
- 图片被裁剪。哪怕只裁掉几个像素,曲线上的坐标关系也会整体错位。
- 用截图代替原文件。截图会重新采样,颜色和位置都可能变化。
- 尺寸超过上限后被本站缩小。缩小后的图片不能与原始尺寸的结果互通。
- 使用了不同的算法。换一个工具、换一个参数,顺序就不一样。
- 文件本身损坏。解码失败时画面可能不完整,自然无法还原。
排查时按“宽高是否一致 → 是否被裁剪 → 是否经过二次压缩 → 是否同一算法”的顺序检查, 通常比反复点按钮更有效。
一次五分钟自检
如果你不确定某张图能否在自己的设备上正常往返,可以按下面的步骤做一次小实验:
- 选一张不重要的图片,用示例图片也可以。
- 把输出格式切成 PNG,点“混淆图片”,下载结果。
- 刷新页面,导入刚下载的混淆图,点“解混淆图片”。
- 用图片查看器对比还原结果与原图。PNG 路径下,正常应达到像素级一致。
如果 PNG 路径能还原、JPG 路径有细微差异,属于有损压缩的正常现象; 如果两条路径都明显错位,通常是宽高被改变,或导入的不是同一张图。