使用 Cloudflare Worker 处理图片

使用 Cloudflare Worker 处理图片

💡 原文中文,约1500字,阅读约需4分钟。
📝

内容提要

作者利用 Cloudflare Worker 与 WebAssembly 搭建图片处理服务,解决 B2 网盘图床不支持缩放剪裁的问题。因 Worker 免费版 CPU 限制及 sharp 不兼容,选用 Photon 和 Squash 的 WebAssembly 方案。服务支持 PNG、JPG 等格式转换、缩放、旋转、剪裁、滤镜和水印,默认输出 WEBP,并具备缓存、白名单和异常降级功能,已开源。

🔎

延伸解读

为何选择 WebAssembly 而非 sharp

文章指出,Cloudflare Worker 不支持多线程,导致常用的 Node.js 图片处理库 sharp 无法运行。作者因此转向 WebAssembly 方案,最终选用 Photon 和 Squash 的 Wasm 版本。这反映了在 Worker 这类受限环境中,传统原生模块可能因线程或系统调用限制而不可用,Wasm 成为可行的替代路径。

免费版 Worker 的 CPU 与体积限制

免费版 Worker 仅有 10ms CPU 时间,容易因资源超限导致图片裂图,作者后来改用 Containers 提升成功率。此外,免费版还有 1M 大小限制,使得作者无法加入 AVIF 和 JPEG XL 输出支持。这些限制直接影响功能取舍和稳定性,是选择方案时必须考虑的因素。

备选方案对比:代理与公共服务

作者曾考虑用 Cloudflare 代理 Vercel Image,但流量需经 Cloudflare、Vercel、Backblaze 等多环节,稳定性和速度不理想,且每月仅 1000 次处理限额。另一个选项 wsrv.nl 同样环节多,且域名不受自己控制,若想控制域名还需再经 Worker,复杂度更高。两者均不理想,促使作者自建服务。

自建服务的功能与防滥用设计

该服务支持 PNG、JPG、BMP、ICO、TIFF 输入,可输出 JPG、PNG、WEBP,默认 WEBP,并支持缩放、旋转、剪裁、滤镜、水印及管道操作。同时具备 Cloudflare 缓存、图片地址白名单防滥用,以及异常降级返回原图(异常场景不缓存)。这些特性兼顾了功能与稳定性,适合作为图床的补充。

❓

Q&A

为什么作者要自己搭建图片处理服务?

作者之前使用 Backblaze B2 和 Cloudflare 搭建了网盘和博客图床,但图床不支持缩放和剪裁图片,而工作中使用阿里云 OSS 处理图片很顺手,因此决定自己搭建一个图片处理服务。

Cloudflare Worker 免费版处理图片有什么限制?

Cloudflare Worker 免费版只能占用 10ms CPU,经常资源超出占用,导致裂图频率很高。此外,免费版 Worker 有 1M 大小限制,因此无法支持输出 AVIF 和 JPEG XL 格式。

为什么没有使用 sharp 库?

因为 Cloudflare Worker 不支持多线程,sharp 短期内无法运行在 Cloudflare Worker 上。

这个图片处理服务支持哪些功能?

支持 PNG、JPG、BMP、ICO、TIFF 格式图片处理,可输出 JPG、PNG、WEBP 格式图片(默认 WEBP),支持管道操作、Cloudflare 缓存、图片地址白名单防滥用,以及异常降级(处理失败返回原图,异常场景不缓存)。

这个服务支持哪些图片操作?

支持格式转换、缩放、旋转、剪裁、滤镜、图片水印、文字水印,以及管道操作(如缩放+旋转+文字水印、缩放+图片水印)。理论上支持 Photon 的各种操作。

这个方案是否开源?在哪里可以找到?

此方案已经开源在作者的 GitHub 上,有需要的可以按照文档部署。

🏷️

标签

➡️

继续阅读