我把小番茄图片混淆做成了安卓App为什么不用网页非要做个App用过“小番茄图片混淆”的人应该知道这东西在贴吧、论坛传图的时候挺常见的。它的逻辑很简单一张正常图片点一下加密就变成雪花屏一样的东西别人看不懂原图但拿着同样的算法又能把雪花屏还原成原图。听起来很实用对吧网站地址https://ranzt.com/xiaofanqiehunxiao网页版。每次想解一张图流程是这样的保存图片 → 打开浏览器 → 搜索“小番茄图片混淆” → 找到那个网站 → 上传图片 → 点解混淆。网站能打开还好打不开就直接卡住。所以我干脆做了一个安卓App把小番茄的混淆算法搬到了手机上。所有处理都在本地跑不上传不联网不需要每次去搜那个网页。混淆到底在干什么先搞清楚原理不然代码没法写。小番茄的核心是空间填充曲线具体用的是Hilbert曲线。这东西说白了就是一条能“填满”整个二维平面的线它会经过平面上的每一个点而且每个点只经过一次。混淆的过程其实就两步用Hilbert曲线把图片里所有像素的位置串成一串把这一串像素整体偏移一定的步数然后按偏移后的顺序重新排列解密就是反向操作把偏移的步数减回去。因为每个像素的位置都变了所以看起来像乱码但位置变化的规律是固定的所以能完全还原。这里有个关键点小番茄做的是像素位置置乱不是改变像素颜色值所以还原后的图片质量跟原图完全一样不会有压缩损失。市面上有些混淆工具是做像素值变换的那种还原后画质会下降小番茄不会。大概花了几天从拆解算法到打包成APK断断续续大概两天。大部分时间不是在写代码而是在解决“安卓为啥不让我直接存图片”这类问题。把JavaScript改成Kotlin网页版小番茄是用JavaScript写的像素操作基于Canvas的ImageData。安卓这边用的是Bitmap操作方式不太一样。最大的区别在于JavaScript的ImageData可以直接操作一个一维数组通过索引访问像素安卓的Bitmap需要用getPixel(x, y)和setPixel(x, y, color)按坐标访问。把算法从JavaScript翻译成Kotlin主要做了三件事生成Hilbert曲线坐标这部分逻辑完全照搬递归算法跟语言无关直接用Kotlin重写像素重排JavaScript用数组索引安卓换成坐标映射批量读写优化安卓的getPixel()单次调用开销不小大图会慢。改成用getPixels()一次性读到数组里处理完再用setPixels()写回去核心代码大概长这样kotlin// 生成Hilbert曲线坐标序列val curve generateHilbertCurve(order)// 加密按曲线偏移重排像素for (i in curve.indices) {val (x, y) curve[i]val (newX, newY) curve[(i offset) % curve.size]pixels[newX][newY] originalPixels[x][y]}适配安卓的几个关键点算法移植本身不复杂但让它在安卓上稳定跑起来有几个地方需要专门处理。1. 大图内存管理Hilbert曲线需要操作整张图片的所有像素。一张手机拍的照片4000x3000如果完整加载到内存光一个Bitmap就要占48MB。处理过程中还会创建新的Bitmap内存峰值可能超过100MB低端手机直接崩。解决办法是做采样加载处理时把图片缩放到合适尺寸最长边不超过2048像素这样内存占用降到原来的1/4左右。保存的时候再保存原始尺寸——因为算法操作的是像素位置缩放后再还原会丢失细节所以保存必须用原图。2. 保存到相册的适配Android 10 之后的分区存储不能直接用文件路径在相册里创建文件了。必须用 MediaStore API系统才会把图片纳入相册索引。实现方式很简单创建 ContentValues指定文件名、MIME类型和存储路径然后通过 ContentResolver 插入并写入数据。保存后图片会自动出现在相册的 Pictures/NoiseVault 文件夹里。3. 异步处理避免卡界面图片处理是CPU密集型操作在Android主线程里跑几百毫秒以上就会掉帧超过5秒会触发ANR应用无响应。用协程把处理逻辑放到 Dispatchers.IO 线程池主线程只负责更新UI。这样用户点击“加密”按钮后界面不会卡死进度反馈正常。kotlinviewModelScope.launch(Dispatchers.IO) {val processed processBitmap(originalBitmap)withContext(Dispatchers.Main) {previewImageView.setImageBitmap(processed)}}4. 权限最小化App只申请两个权限读取存储和写入存储。不需要网络权限不需要定位权限不需要相机权限。用户安装的时候可以看到权限列表。成品长什么样App界面就一个页面上面显示图片预览中间是模式切换加密/解密和次数调节1-99次下面是三个按钮选图、处理、保存。深色模式跟随系统没有广告不需要联网权限。整个安装包不到5MB。关于核心算法内容需要说明一下小番茄基于空间填充曲线的混淆方案在学术和开源领域已经存在很久了并不是我发明的。我做的只是把网页版的实现方式移植到安卓本地让用户可以在手机上离线使用不用依赖网页和网络。这个App里不包含原项目的任何代码、图片或品牌元素只保留了算法实现。如果你在贴吧或论坛里收到小番茄混淆图可以直接用这个App解不用再开网页。下载地址源码和APK都在GitHub上https://github.com/Bologna-Zaicek/Tools-NoiseVaultReleases里有APK文件下载安装后直接用。安装包不5MB权限只有读取和保存图片。