shadcn.io— 数千款 shadcn/ui 区块
跳转到内容

浏览器里转图片到底是怎么做到的(以及我为什么这么造)

这整个站之所以存在,起因是我多年前一个小小的、说不上来的别扭瞬间。我要把一张 HEIC 照片转成 JPG,就在搜索框里敲了最顺手的那句话,落在了一个转换器上,它要我把照片上传到它的服务器。于是我传了。它管用。然后我就坐在那儿想:这张照片现在正躺在一台我一无所知的机器上,运营它的人我永远不会见到,它会被留多久我也从没被告知过。换成一张随便的截图,无所谓。可它不是截图,它是一张私人照片,而我刚刚为了给自己省下三十秒,就把它交给了陌生人。

那就是我下决心以后再也别摊上的问题。而答案最后是:那次上传,从一开始就根本没必要。

老办法:租一台陌生人的电脑

传统的在线转换器,工作起来像个邮购服务。你把文件寄上去,到一台服务器。服务器用装在它自己机器上的软件跑转换,再把结果寄回来。你的图片在你管不着的硬件上打了个来回,而中途的某处,它整整齐齐地躺在了一块不属于你的磁盘上。

任何拴在这个模型上的隐私承诺,本质都是关于「行为」的承诺——文件一小时后会删掉,没人会去看。也许它守得住,也许吧。可你没有办法去核实,而你交出去托付的,是你文件实打实的每一个字节。这份信任就是整个架构,而信任,恰恰是我不想再花出去的东西。

新办法:你的浏览器本身就有那台电脑

变的是这个。现代浏览器能以接近原生的速度运行真正编译好的程序,靠的是一样叫 WebAssembly 的东西——简称 WASM。那些过去住在服务器上的图像编码器——读 PNG 的代码、编码 WebP 的代码、解码 HEIC 的代码——都能编译成 WASM,就在你早已打开的那个浏览器标签页里运行。

所以当你把一个文件拖到一个这样构建的页面上时,那套转换软件会像网页的其他部分一样,下载到你的机器上,一次就好。从那一刻起,真正的活儿——读你的图、转码、写出新文件——都发生在你自己的处理器上、你自己的内存里。结果直接作为一个下载递还给你。你的文件从不被送往任何地方,因为压根没有一个地方可以送。这中间没有服务器。

这就是为什么我能说「你的文件从不离开你的设备」,并且把它当作一个事实、而不是一条政策来说。不是我保证不去看,而是根本不存在一条能让你的图片到达我这儿的路径。哪怕法院命令我,我也取不出你的照片,因为它从未到过我这一侧的线路上。这份隐私不是我加在上头的一个功能,它是代码运行在哪里的一个必然结果。

你怎么验证这是真的

你不必信我这张嘴,而这正是我最喜欢的一点。打开浏览器的开发者工具,盯着网络面板,转换一个文件。你会看到页面和 WASM 编码器各下载一次。你不会看到你的图片传上去。更妙的是:把页面加载好,关掉 Wi-Fi,照样转一个东西。它依然管用,因为它需要的一切早就在你的机器上了。一个会上传文件的工具做不到这一点,这一个可以。

唯一那个真实的局限

我答应过要诚实,那就说了:在你自己的设备上跑转换,意味着它用的是你自己的内存,而一个浏览器标签页能动用的内存并不是无限的。

对于正常文件——照片、截图、logo,人们整天都在转的那些东西——这根本不是问题。可要是你扔一个真正庞然大物给它,一张分辨率极端的单图,或者一大批一次性全上,你就可能撞到天花板。解码一张图意味着要把它未压缩的像素全都端在内存里,那比磁盘上的文件大得多,而一张巨图能耗尽这个标签页被允许动用的量。真到那时候,转换会慢得像爬,或者标签页干脆放弃。

一台有 64 GB 内存的服务器永远不会有这个麻烦。所以这笔账,摊开来讲:一个服务器端的转换器,能啃下比你的设备所能承受更大的文件。这个办法做不到。它给你的交换条件是,你的文件从不脱离你的掌心。对于绝大多数人们真正会去转的东西,这是一笔值得眼都不眨就做的买卖。而对于极少数的怪兽文件,它是一个真实的局限,我宁愿告诉你,也不愿假装它不存在。

我为什么还是认为这是对的默认

多数转换都是些从一开始就没必要碰服务器的普通文件。那次上传,一直只是一个时代的遗留物——那时候浏览器自己干不了这活。现在它们能了。所以那个合理的默认就翻了过来:把文件留在你的机器上,本地把活干了,只在极少数你自己的硬件确实扛不住的场合,才去找服务器。

这就是这里的一切背后的全部想法。它就是我在那个别扭的下午之后,给自己造的那个站,好让我再也不必仅仅为了换个文件后缀,就把一张私人照片交给陌生人。原来我从来都不必这么做。你也不必。

相关文章


全部文章