运作方式
你的文件由你正在用的浏览器打开,从来不会被送去任何地方。
以下是实际运行的东西,按执行顺序排列,还有一分钟之内自己验证的方法。
文件是被读取,不是被上传
放入文件时,页面拿到的是一个 File 对象,用 File API 在这个标签页里读进内存。没有任何请求带着它走,因为根本没有地方可以去:这个网站只是 CDN 上的静态文件,没有服务器代码可以接收东西。
- File 与 Blob 承载字节,FileReader 与 arrayBuffer 负责读取
- 拖放、选文件、粘贴,交出来的都是同一个对象
- 只要有页面出现 fetch、上传、form action 或 API 路径,构建就会失败
解码在标签页里发生
相机和设计软件写出的格式,浏览器自己打不开,所以解码器随页面一起送到,就在旁边运行。
- HEIC 与 HEIF:libheif 的 JavaScript 版本,由本站自己提供
- PDF:PDF.js,其中部分图像编解码会用到 WebAssembly
- SVG 描摹用 ImageTracer;读 QR 用 jsQR;写 PDF 用 pdf-lib
- 每一个库都在构建时下载并由本域名提供,所以没有第三方 CDN 看得见你的访问
处理跑在 canvas,而且在 worker 里
缩放、压缩、转换都是 canvas 运算。它们在 Web Worker 内执行,所以大张照片不会让你眼前的页面卡住。
- worker 里的 OffscreenCanvas 负责绘制与重新编码每一张图
- convertToBlob 产生 JPG、PNG 或 WebP,质量由你决定
- PNG 压缩用的是为本站自己写的 median cut 调色板,不是外来库
- 文件的任何信息 —— 名称、大小、内容或由它们推导出来的东西 —— 一律不测量、不回报
结果也是在这里造出来的
你下载的东西,是在这个标签页组好的 Blob,再以 object URL 交给浏览器。它从来没有在别的地方存在过。
- 一次一个文件,或在标签页里打包成 ZIP
- 关掉标签页结果就消失;没有任何东西被存起来等你回来拿
自己验证
不要只信这一页。两个方法,都不用一分钟。
- 打开 DevTools 的 Network 面板,然后转换一个文件。不会有任何带着你文件的请求离开。
- 载入页面后把网络关掉,再用那个工具。它照样运作。
- 看源代码:这里运行的每一样东西都是你可以直接打开来看的文件。
设备端与上传式工具并排比较
两种工具都存在,也都正当。分别在于你的文件去了哪里,而这个分别决定了你要相信什么。
| 在你的设备上 | 上传到服务器 | |
|---|---|---|
| 文件去哪里 | 留在标签页内 | 传去服务器 |
| 保留多久 | 没有东西需要保留 | 通常在设定的时限后删除 |
| 能否离线用 | 页面载入后可以 | 不可以 |
| 文件大小上限 | 你设备的内存 | 服务允许的上限 |
| 你要相信什么 | 页面做了什么,而你看得到 | 服务声称自己做了什么 |
每一个工具,同一套规矩
全部都是这样运作。这里没有付费版、没有账户,也没有会离开的文件。