一张图揉碎 50 次,还能原样拼回来吗?

不是「加密」,而是「置换」:矩阵把每个像素搬去新位置,一个不丢、也不多一个。搬得足够多次,图变成彻底的雪花噪声——但置换必循环,转够一圈,原图自己走回来了。

现场揉碎

挑一张样例图或上传自己的图,拖动滑条把像素「揉碎」到任意次数。然后——把次数拉满到周期 T,看它原样回来。

先挑一张

或者上传你自己的图

支持 JPG / PNG / WebP · 会自动居中填充为方形

为什么揉碎了还能拼回来

01

不是抹掉,是搬家

每个像素 (x, y) 被矩阵 A 送到新位置 (x+y, x+2y),然后对 N 取模。所有像素一次变换全部换位,一个不少、一个不多——所以它不是「加密」,是「置换」。

02

取模让一切留在图里

坐标算完都要 mod N,像素永远出不了图。而 det(A)=1 保证变换是双射:两个不同像素绝不会撞到同一个位置,所以信息零损耗。

03

置换必循环

有限集合上的排列,迭代足够多次必然回到起点——这是置换群的基本定理。周期 T 只由边长 N 决定,跟图片内容毫无关系。

妙在哪

「揉碎」看起来像随机噪声,实际上每一步都是严格确定的数学运算。看似无序的雪花背后是一台精确的时钟:对 2 的幂边长 N=2k(k≥3),周期 T = 3·2k-2。512 的图,T=384——不多不少,转够 384 次,原图自动归位。混乱是有周期的。

核心代码

// 前向:像素 (x, y) 搬去 (x+y, x+2y),全部对 N 取模
function forward(x, y, N) {
  return [(x + y) % N, (x + 2 * y) % N];
}

// 逆向:一次变换,从任意置乱状态还原
function inverse(x, y, N) {
  return [(2 * x - y) % N, (-x + y) % N];
}

// 周期检测:迭代直到映射变回恒等
function findPeriod(N) {
  let cur = forwardMap(N), t = 1;
  while (!isIdentity(cur)) {
    cur = compose(cur, forwardMap(N));  // 再搬一次
    t++;
  }
  return t;  // N=512 → 384
}

一个矩阵、两次取模、一个循环。没有随机数,没有密钥,没有任何「隐藏信息」——纯排列的必然轮回。

它被用来干嘛

图像置乱(加密预处理)

先把像素打乱,再做真正的加密——置乱本身不是密码,但它能把明文的结构彻底抹平,让后续加密更安全。

数字水印

论文/照片加水印前先 Arnold 置乱,水印被分散到全图,裁剪、压缩后依然能抠出来。

混沌系统的入门钥匙

Arnold 变换是「确定性系统的不可预测性」最简单直观的例子:规则完全公开,过程却像随机。混沌加密的教科书开场白。

名字的来历

1960 年代,苏联数学家 Vladimir Arnold 用一张猫脸图演示这个变换,猫就成了数学史上最著名的实验动物。