常见问题 FAQ

下面这些问题按「隐私安全 → 算法原理 → 使用操作 → 结果质量」排序,逐条给出直接答复。

这里把图片混淆与解混淆最常被问到的问题按隐私安全、算法原理、使用操作、结果质量四组列出来,每条都给出一句可以直接判断的答复。

隐私与安全

处理图片的时候,图片会被上传到服务器吗?

不会。解码、置换、编码三步都在你当前浏览器的页面里完成,图片数据从读取到导出始终没有离开本机。验证方法很直接:等页面加载完成后断网,再拖入一张图片,混淆与解混淆照样能跑完。打开开发者工具的网络面板处理图片,也不会出现图片数据请求。页面自身的 HTML、样式与脚本仍需联网加载,不过它们接触不到你的图片内容,整段流量里也没有图片数据。

断网以后还能不能用?

在页面已经加载完成的前提下可以。全部计算都由本地脚本完成,不调用任何服务器接口,所以断网、内网或代理受限的环境都能正常处理图片。前提有两条:一是页面本身打开过,如果浏览器缓存被清空又恰好断网,页面加载不出来自然就用不了;二是图片要在本机,从聊天软件里点开却还没保存到磁盘的图片,断网后可能拿不到源文件。稳妥做法是联网时先把工具页完整打开一次。

处理过的图片会不会留下记录?

本站不保存任何图片或处理记录,因为图片根本没有上传,传输链路上不存在可被记录的图片数据。需要你自己留意的痕迹都在本机:下载目录里的输出文件会一直存在,页面存活期间浏览器可能在内存或会话缓存里持有像素数据,刷新或关闭标签页后由浏览器回收。如果处理的是敏感图片,建议及时清理下载目录,并使用无痕窗口操作。

混淆能不能当加密用?

不能。混淆只是把像素按固定规则换了位置,算法公开、没有密钥、完全可逆,任何人拿到图片都能用同一套工具还原。加密依靠密钥把内容变成没有密钥就无法恢复的形式,混淆不提供这层保证。它能做的是提高自动化程序直接复用图片的成本,让人在缩略图尺寸下读不出内容,而不是保护真正敏感的信息。需要保密的图片请使用具备密钥的加密手段,具体边界可以看与同类方案的对比。

别人拿到我的混淆图,能不能还原?

能。混淆没有密钥,还原所需的全部信息就是图片的宽高,而宽高本来就写在文件里。对方只要用同一套算法的解混淆功能,就能把图片复原到可辨认的状态,整个过程不需要你提供任何口令。这是混淆与加密最本质的差别,也是本站反复强调混淆不等于加密的原因。它能挡住批量抓取和顺手转发时的直接复用,但挡不住任何愿意花几分钟手动处理一次的人。

能不能用它处理证件照这类敏感图片?

不建议依赖混淆来处理。身份证、病历、合同这类图片的信息以像素形式原样留在图中,混淆只移动位置、不删除内容,颜色直方图也不会变化,文字、印章、人脸的像素都还在。正确的顺序是先做真正的脱敏:把敏感区域永久遮挡或者直接裁剪掉,确认导出图片里不再包含这些像素,然后才考虑要不要再混淆一层。如果脱敏没做,混淆反而会带来已经处理过的错觉。

算法与原理

用的是什么曲线?

用的是广义吉尔伯特曲线(Gilbert curve,希尔伯特曲线的矩形推广),它属于空间填充曲线。常见资料里讲的多是希尔伯特曲线,那种曲线只定义在边长为 2 的整数次幂的方形网格上;本站面对的是 640×480、1920×1080 这类任意宽高的矩形,所以采用能适配任意 W×H 的吉尔伯特变体。它的性质与希尔伯特曲线一致:不自交、不遗漏、不重复,恰好走遍每个像素一次。

位移量是怎么算出来的?

公式是k = round((√5 − 1) / 2 × W × H),其中 (√5 − 1) / 2 ≈ 0.6180339887,也就是黄金分割共轭,即 1/φ。W×H 就是像素总数 N,所以位移量约为总像素数的 61.8%,再四舍五入取整。举两个实测值:1920×1080 的 N 是 2 073 600,k 为 1 281 555;640×480 的 N 是 307 200,k 为 189 860。同一宽高组合的 k 永远相同。

为什么这个算法是可逆的?

因为整条链路由两个双射组成。曲线序把每个像素映射到唯一的一维下标,不重不漏;位移则是在这条一维序列上做循环移位,同样是双射。混淆把序列右移 k 位,解混淆把它左移 k 位,两次操作合起来就是恒等变换,所以能原样还原。精确写法是:混淆时 out[order[(i + k) mod N]] = in[order[i]],解混淆时 out[order[i]] = in[order[(i + k) mod N]]。

为什么要沿着曲线走,而不是按行扫描?

因为曲线序让一维上的相邻像素在二维上也相邻,位移后的落点在横竖两个方向上都更均匀。按行扫描时,一维序列里每一行的末尾与下一行开头在图像上相隔整行,位移会把这些断口变成明显的水平条带,残留的规律更容易被自动化方法利用。吉尔伯特曲线在矩形内连续推进,没有这种人为断口。顺带一提,1920×1080 与 1080×1920 的 N 与 k 相同,但曲线形状不同,结果完全不同。

这是不是自己改过的算法?

置换方案本身没有改,仍是广义吉尔伯特曲线遍历加黄金分割位移这一公开思路,输出与原工具一致,JPEG 输出的质量参数同样取 1,所以两边结果可以互相还原。改动只在工程实现层:原始实现用 Array.prototype.slice 逐像素拷贝,本站改成逐字节直写,结果逐字节一致但速度更快;曲线序也从保存坐标数组改成保存线性下标的 32 位整型数组,显著省内存。

位移量是不是密钥?

不是。k 完全由图片宽高决定,公式公开,任何人拿到图片就能算出同一个值。它没有随机性,也没有可以更换的私密参数,所以既不能作为密钥,也不能靠猜不到 k 来保证安全。k 的作用是让置换后的像素分布尽量分散,避免出现肉眼可辨的规整图案。真正决定还原难度的是曲线加位移这一整套公开规则,而它本来就是对所有人可见的,来历可以看黄金分割位移。

使用与操作

支持哪些图片格式?

只要浏览器能解码的常见格式都可以作为输入,实际最常遇到的是 PNG、JPEG 与 WebP。输出可以选两类:与原工具一致的 JPEG,或者无损的 PNG。格式选择会直接影响还原质量,JPEG 是有损压缩,混淆后存成 JPEG 再解混淆无法逐像素还原,PNG 则全程无损。带透明通道的 PNG 也能处理,透明像素同样会被纳入置换,透明度与颜色一起搬家。

能不能批量处理?

可以。工具页提供单张与批量两种模式,批量模式下把多张图片一次性拖进队列,每张依次处理,完成后可以打包下载结果。适合的场景是同一批截图需要统一打乱,或者一批混淆图需要一起还原,结果按原文件名一一对应,方便核对。批量处理同样受像素上限约束,单张超限的图片会先等比缩放;队列很长时建议分批进行,因为一次塞进几十张大图容易让内存吃紧。

手机上能不能用?

能用。本站是纯前端页面,手机浏览器打开即可操作,支持从相册选图。限制主要来自内存:手机浏览器给单个标签页的可用内存比桌面少,处理接近 800 万像素的图片时页面可能变慢,甚至在后台被系统回收。稳妥的做法是先用相册或图片应用把长边缩到 2000 像素左右再处理,同时避免把很多张大图一次性放进批量队列;处理过程中也不要切到后台,标签页被系统回收会直接中断任务。

处理上限是多少?

单张不超过 8 000 000 像素,也就是 800 万像素,并且单边不超过 4000 像素,与原工具保持一致。超过上限时不会直接报错,而是先做等比缩放再处理。这里有个必须知道的后果:缩放会重采样像素,图片不再是原来的那些像素,因此即使输入输出都用 PNG,混淆再解混淆也不再是无损往返,结果和原图会有差异。需要严格无损,就先把图片裁到上限以内。

混淆和解混淆按钮选错了会怎样?

不会损坏文件,只是得到另一张被置换过的图。混淆与解混淆互为逆运算,方向选错相当于又做了一次置换:本来想解混淆却点了混淆,图片会被打得更乱,此时再选解混淆处理一次就能回到上一次的状态。真正需要留意的是保存环节,如果选错方向之后又存成了 JPEG,多出来的一次有损编码会留在像素里,再解也回不到最初的原图。

结果与画质

为什么还原之后会有噪点?

因为中间经过了 JPEG 有损压缩,不是算法本身的问题。JPEG 编码包含 DCT 变换、量化与色度抽样,量化会把高频系数抹掉,像素值被永久改变。混淆图存成 JPEG 后,解混淆会把已经改变过的像素搬回原位,误差随之散落到整张图上,表现为块状噪点与彩边,文字边缘、毛发、细线这些高频区域最明显。全过程改用 PNG 就不会出现这个问题,推导可以看可逆性与误差分析。

为什么用 PNG 更好?

PNG 是无损压缩,解压后能逐字节恢复原始像素。只要整条链路都是无损的,也就是 PNG 进、PNG 出、不触发等比缩放,混淆再解混淆得到的结果与处理前完全相同,可以用「无损往返」这个功能验证是否逐字节一致。PNG 的代价是文件更大,尤其混淆后空间相关性被破坏,压缩率会进一步下降。要画质就用 PNG,要体积小再考虑 JPEG。

为什么混淆之后文件会变大?

因为像素被打乱后,空间相关性被破坏了。JPEG 与 PNG 都靠相邻像素差别不大这一点来压缩,预测编码、熵编码与滤波都在利用这种规律。置换把原本挨着的像素拆散到图像各处之后,相邻位置的像素值变得互相无关,预测误差变大,压缩效率随之下降,同样的画质就需要更多字节。这不是缺陷,而是置乱必然带来的结果:位置越随机,压缩算法越难找到可以利用的规律。

为什么处理完尺寸变了?

常见有两种原因。一是原图超过 800 万像素或单边 4000 像素,工具先做了等比缩放,长宽按同一比例缩小,所以看起来变小了。二是手机照片带有 EXIF 方向标记,浏览器会先按这个标记把图像摆正,处理的是看起来的方向,输出的宽高可能与文件里记录的原始宽高互换。输出经过画布重新编码,EXIF 信息会丢失,拍摄参数与方向标记都不再保留。

多次处理会不会越来越差?

取决于中间用什么格式保存。置换本身不引入任何误差,纯粹是位置交换,所以反复混淆再解混淆并不会让画质累积退化,前提是全程 PNG 且没有触发缩放。如果每轮结果都存成 JPEG,每次保存都会重新做一遍 DCT 与量化,误差一次次叠加,几轮之后噪点会明显加重。判断标准很简单:看中间环节有没有有损编码,而不是看处理了多少次。

没找到答案怎么办

需要再次强调局限:混淆不是加密,任何人都能解混淆。涉及真实敏感信息时,请先做永久性的遮挡或裁剪,再考虑要不要混淆。

上面 22 条覆盖的是提问频率最高的问题。如果你的现象不在其中,可以先到术语表确认名词含义,再到图片混淆 / 解混淆工作台用一张小图复现一遍,把结果和预期对照。输出格式的取舍另有一篇输出格式与画质专门讲清楚。

本文更新于 2026-10-14。文中算法说明基于本站实际运行的实现整理,行为可通过 _build/verify-core.mjs 复核。

内容为本站原创,转载或引用请注明来源「小番茄混淆解图」并保留原文链接。