RoundCut 如何运作

技术细节说明每个工具做什么、在哪里运行,以及您如何自行验证。

简短说明

RoundCut 采用混合架构:大多数工具完全在您的浏览器中运行,零上传,而少数工具会在浏览器无法匹敌质量时,将单次网络请求路由到我们自己的基础设施,并且始终带有一个不可见的客户端回退。我们会告诉您当前所在的路径,在每款工具中,也在本页面上。

下面的表格是代表性的,并非详尽列举(新工具会定期上线)。它为每一类路径各举一个例子:

示例工具工作在哪里进行
Circle Crop(仅浏览器)100% 在您的浏览器中,Canvas API。没有上传,可离线工作。
Compress 预览(仅浏览器)100% 在您的浏览器中,canvas.toBlob。没有上传。滑块保持即时。
Compress 最终下载(涉及服务器)与我们位于 api.roundcut.com.br 的服务往返一次(德国 VPS 上的 Fastify + sharp + libvips),并带有浏览器回退。
Remove Background(涉及服务器)与一个 Cloudflare Worker 往返一次,它在 Cloudflare 边缘 GPU 上运行 BiRefNet,当云端无法连接时在您的浏览器中带有 WebAssembly 回退。

裁剪、调整尺寸、格式转换(AVIF 编码除外),以及 Compress 预览,全都完全在您的浏览器中运行。背景移除、Compress 下载、AI 放大、AVIF 编码,以及多图 PDF,每一项都会路由单次请求,并在云端无法连接时回退到浏览器。

您可以在大约 30 秒内验证客户端的说法:打开 DevTools → Network,清空日志,然后使用一款仅浏览器的工具,比如 Circle Crop 或 Compress 预览滑块,您会看到没有任何携带您图像字节的请求离开页面。对于涉及服务器的工具,您会看到每次操作恰好一次上传,发往具名的 endpoint。

为什么用混合方式

大多数在线图像工具都处于某一极端:把所有内容上传到服务器(您要等待往返,运营方还会留存您的文件),或者全在浏览器中(您在编码/AI 步骤上付出质量和速度的代价)。两个极端都不可能在所有场景中取胜。

我们在浏览器已经出色的地方选择客户端,<canvas> 元素负责裁剪、旋转、调整尺寸,以及 JPG/WebP 的有损预览编码,而在浏览器仍有可测量差距的地方选择服务端:

  • 图像压缩,在最终下载时。服务端的 sharp + libvips 8.17 在相同视觉质量下,逐字节生成比浏览器编码器小 10-15% 的文件,并提供浏览器不暴露的 AVIF 速度/色度调校以及 JPEG XL 输出。滑块/预览仍在您的浏览器中运行,以保持每次调整都即时,只有”下载”那一下会经过我们的服务。
  • AI 背景移除和 AI 放大,在默认路径上。这些模型(用于分割的 BiRefNet、用于放大的超分辨率)需要真正的 GPU 才能在数秒内完成。浏览器内的回退能用,但更慢,并且在头发、毛发和细小边缘处会产生肉眼可见更粗糙的结果。
  • AVIF 编码,在转换时。浏览器内的 AVIF 编码器在某些设备上较慢,因此 AVIF 输出会把一次请求路由到压缩 Worker,并以浏览器主线程编码作为回退。

我们为这些路径选择服务端而接受的代价,是每次操作一次往返。而我们在其他所有地方坚持客户端所避免的代价,是把往返开销加在工作流中迭代最频繁的部分上。

流程,一步一步

1. 您选择一个文件

通过文件选择器、拖放或粘贴,浏览器把一个 File 对象交给 JavaScript。JavaScript 用 FileReaderBlob.arrayBuffer() 读取这些字节。在这一步的任何时刻,文件都不会通过网络发送,无论您使用哪款工具。

2. 浏览器解码图像

现代浏览器原生解码 JPG、PNG、WebP、GIF 和 AVIF。我们用 createImageBitmap() 把原始字节变成 GPU 可以处理的 bitmap,在主线程之外完成。对于浏览器无法原生解码的 HEIC,我们回退到一个在您浏览器中本地运行的 WebAssembly 解码器。

3. 工具开始干活,路径在这里分叉

  • 仅浏览器工具(裁剪、调整尺寸、转换为 PNG/JPEG/WebP 的格式转换、Compress 预览)。一个 Canvas 2D 像素变换或一个 WebAssembly codec 在本地重新编码 bitmap。结果无需任何上传即可就绪。Cropper.js 为裁剪工具处理交互式裁剪框,canvas.toBlob 处理预览的重新编码。完全在您的浏览器中。
  • Compress,下载。 当您点击”下载”时,图像会被发送一次到 api.roundcut.com.br(一个运行在德国 VPS 上、由 Hostinger 运营的 Fastify 服务,Node 24 + sharp 0.34 + libvips 8.17,与 Squoosh 在其服务端路径上所用的是同一批 C 库)。它会按您在预览中设定的相同参数重新编码,字节再流式返回到您的浏览器。该服务保留一个按租户隔离、内容寻址的缓存(输入字节加参数的哈希),上限为 500 MB,因此用相同设置重新下载同一张图像会重放缓存的字节,缓存不按您、IP 或文件名建立索引。如果服务无法连接,工具会回退到浏览器内的预览 blob。
  • Remove Background,默认云端路径。 图像被上传一次到一个 Cloudflare Worker,暂存在一个私有 R2 存储桶中,由 Cloudflare 的 cf.image.segment 转换处理,它在 Cloudflare 边缘 GPU 上运行 BiRefNet 模型,抠图结果再流式返回。无论结果如何,暂存的 R2 对象都会由一条 R2 生命周期规则在一小时内删除。一张普通照片在 1-3 秒内完成。按 IP 的每日上限和 5 MB 的上传上限让免费层级保持可持续。
  • 其他云端支持的工具(AI 放大、AVIF 编码、多图 PDF)遵循相同的形态:向具名基础设施发出一次请求(用于超分辨率的云端图像 API、用于 AVIF 编码的压缩 Worker、用于多图 PDF 的我们的 VPS 服务),结果流式返回,若该请求失败则有一个不可见的浏览器内回退。
  • WebAssembly 回退。 如果相关的云端路径无法连接(您的网络中断、您身处严格的防火墙之后、每日配额已满,或文件超过云端上限),工具会不动声色地切换到一个在您浏览器中运行的本地模型或 codec,例如通过 ONNX Runtime Web 配合 WebAssembly 运行的 ISNet 背景移除模型。首次运行会下载模型,因此较慢,后续运行更快。这些回退路径上没有上传,您可以在 DevTools 中验证。

4. 您下载结果

输出的 bitmap 被编码成一个 Blob,包进一个 object URL,再提供给您浏览器的标准文件保存对话框。文件就出现在您的磁盘上。

如何亲自验证

挑您喜欢的方式:

方法 1. 观察 Network 标签页

  1. 在一个新标签页中打开 RoundCut,并打开 DevTools → Network
  2. 使用一款仅浏览器的工具,Circle Crop 或 Compress 预览滑块。您只会看到对 HTML/CSS/JS/字体的请求,外加首次使用时相关的 WebAssembly 模块。不会有任何请求携带您的图像字节。
  3. 现在使用一款涉及服务器的工具,Compress → 下载 或 Remove Background。您会看到恰好一个携带您图像的 POST,以及一个带回结果的响应。把鼠标悬停在任意请求上即可看到大小和耗时。

“Initiator” 列告诉您是哪个脚本触发了每个请求,“Type” 列告诉您发送了什么。这两者我们都不隐藏。

方法 2. 离线使用这些工具

  1. 加载任意 RoundCut 工具页面。在一张小图上使用一次 Remove Background,让浏览器内的 ISNet 模型被缓存。
  2. 打开 DevTools → Network → 勾选 Offline(或关闭 Wi-Fi)。
  3. 重新加载页面,静态资源已被缓存,所以它仍能加载。
  4. 试试这些工具:
    • 仅浏览器工具(Circle Crop、调整尺寸、Compress 预览)照常工作,它们从来就不需要网络。
    • Compress 下载 回退到浏览器内的预览 blob(编码效率略低,但可用)。
    • Remove Background 回退到 ISNet 的 WebAssembly 模型,在没有任何对外请求的情况下工作。

如果这些工具在离线时仍能工作(云端支持的略有下降,仅浏览器的完全一致),那么按定义就没有任何服务器看过您的图像。

我们看得到什么,看不到什么

客户端路径上,我们对您的图像一无所知。没有请求可看,没有缓存可存它,没有日志行可 grep。

服务端路径上:

  • 压缩与 PDF 服务在编码期间(通常几百毫秒)看到图像字节,按缓存 TTL 保留一条内容寻址的缓存条目,仅此而已。缓存不按用户、IP、文件名或任何我们能用来找到”您”的图像的标识符建立索引。我们不记录图像内容。该编码服务在切换之前 v1 所服务的同样两个租户之间共享,带有按租户的 CORS、限流,以及 HMAC 签名的规范 URL。
  • Remove Background 和其他 AI 路径在暂存上传和模型调用期间(通常几秒)看到图像,之后暂存副本由一条 R2 生命周期规则删除。BiRefNet 模型运行在 Cloudflare 自己的基础设施内部,而不是某个 remove.bg / fal.ai / Replicate 风格的外部 API 上。

在每一条路径上,我们的分析提供方(Cloudflare Web Analytics)记录页面浏览量的汇总数据。URL、国家/地区、浏览器系列、Core Web Vitals。没有 Cookie,没有持久标识符,没有任何与个人关联的东西。

对于在首次使用时下载一个 WebAssembly 模块的工具(HEIC 解码器、ISNet 的 ONNX 模型),我们的托管服务方会看到有人取走了该模块,就如同它看到他们取走 CSS 文件一样。模块本身不包含任何关于您图像的信息。

完整的数据清单在我们的隐私政策中。

技术栈

给好奇的人:

  • Astro,静态网站生成器。每个页面都以纯 HTML 形式发布,仅在有交互式工具的地方带有渐进增强的 JavaScript “孤岛”。
  • 带自定义属性的原生 CSS,没有 Tailwind,没有 CSS-in-JS。整个设计系统就是一个 tokens.css 文件。
  • canvas.toBlob / <canvas>。仅浏览器工具中的 JPEG、PNG、WebP、AVIF(浏览器支持的)编码,以及全部裁剪和调整尺寸的工作。
  • Cropper.js,裁剪矩形的交互层。
  • ONNX Runtime Web,为 Remove Background 运行 ISNet 的 WebAssembly 回退。
  • Cloudflare Pages,托管静态构建,从边缘提供服务。
  • Cloudflare Workers + R2 + cf.image.segment(BiRefNet),默认的 Remove Background 流水线。
  • Node 24 上的 Fastify + sharp 0.34 + libvips 8.17api.roundcut.com.br 上的压缩与 PDF 服务,运行在德国的一台 Hostinger VPS 上。
  • Cloudflare Web Analytics,汇总的、无 Cookie 的页面浏览量统计。

浏览器支持

每款工具都能在 Chrome、Firefox、Safari 和 Edge 的当前版本与上一版本上运行,桌面和移动端皆可。本站采用渐进增强:在浏览器支持较新 API(例如 showSaveFilePickerOffscreenCanvas)的地方我们就用它,在不支持的地方我们回退到较旧的等价方案。这里没有”您的浏览器不受支持”的拦阻墙。

唯一的硬性要求是 JavaScript(任何工具都需要)和网络连接(只有在默认路径上使用云端支持的工具时才需要,仅浏览器工具在首次页面加载后完全离线运行)。

疑问

有什么我们没讲到的吗?发邮件至 support@roundcut.app。欢迎技术问题。