banner
约 2,100 字
7 分钟

Cloudflare 免费部署的图片工具已更新:新增 AI 图片放大功能

摘要

上一篇那个本地图片工具更新了,新增 AI 图片放大,最高 4 倍。推理全部在浏览器里跑,图片不上传、不出本机。本文讲清放大怎么用、三个参数各管什么、哪些图值得放大,以及部署时新增的两个注意事项。

meta.jpg

前言

上一篇《Cloudflare 免费部署图片压缩转换网站,本地处理无需上传》发出去以后,陆续有朋友照着部署了一份自己的。这段时间我又把项目往前推了一步:除了原来的压缩和格式转换,新加了 AI 图片放大 —— 最高放大 4 倍,而且和压缩一样,图片全程留在你自己的设备上,不上传、不出本机。

这篇重点讲这个新功能:怎么用、能到什么程度、有哪些坑。压缩和部署部分没有变化,我放在后面简单带过,步骤和截图跟上一篇完全一致。

这次更新了什么

改动主要在界面上:顶栏多了一组胶囊标签,图片压缩AI 放大 两个工具共用同一个页面外壳,点一下就能切,不用整页跳转。同时两边各自保留独立网址,可以分别收藏、分别投放:

工具

网址

干什么

图片压缩

/

压缩、格式转换(AVIF / WebP / JPEG / PNG / JPEG XL)

AI 放大

/upscale/

把图片放大 2~4 倍,AI 重建细节

两个工具的共同点是:所有计算都在浏览器里完成。没有后端、没有上传队列、也没有"正在等待服务器处理"。图片不离开这台设备 —— 这也是我一直愿意用它的原因。

AI 放大怎么用

1. 第一次打开,先等它下载模型

打开 /upscale/,界面和压缩页是同一套,同样一个大大的拖拽区。但第一次用会多一步:需要下载约 11 MB 的推理引擎和模型权重。

blog image

这 11 MB 里,一部分是 ONNX Runtime 推理引擎,一部分是超分辨率模型的权重文件。它们是纯静态资源,跟着网站一起部署在 Cloudflare 上,不额外产生任何费用。下载过一次之后会缓存在本机,之后再打开就不用重复下了。

2. 拖进图片,调好参数

把图拖进去(或者点一下选文件),右侧是三个参数:

blog image

模型:目前内置一个 Real-ESRGAN General x4 v3,4.6 MB,定位是通用照片模型 —— 体积最小、出图最快。项目里留好了扩展位,之后可以往里加别的模型(动漫、人像这类专用模型)。

放大倍率:2×、3×、4×。模型本身是按 4 倍训练的,选 2× 或 3× 时,是先把 4 倍结果算出来再缩回去,界面底部会注明这一点。倍数越大越慢,细节也越多。

瓦片重叠:默认 8 px。放大是分块做的 —— 图片会被切成一块块 128×128 的小方块分别推理,再把结果拼回去。相邻两块各算各的,拼缝处容易留下一条痕迹,所以要让它俩重叠一点。重叠越大接缝越不明显,代价是计算量上升、速度变慢。一般不用动,除非你在成图里看到了网格状的接缝。

3. 拖动滑块对比,满意就下载

处理完之后,画面中间会出现一条可以拖动的分割线,左边是原图,右边是放大后的结果,按住往左右拖就能直接看细节差多少。

按钮有三个:再放大一次(把当前结果继续放大,适合想再多榨一点细节的情况)、下载 PNG换一张图。输出格式是 PNG,无损保存放大结果。

它是怎么做到「本地放大」的

简单说,它不是把图片拉伸变大,而是让模型去重建细节。

这类超分辨率模型(Real-ESRGAN)在训练时看过大量「低分辨率 → 高分辨率」的图片对,学到的是边缘该怎么收、纹理该怎么补。所以放大出来的线条是重新画过的,而不是被插值糊成一团。当然它也不是万能的 —— 只能重建「看起来合理」的细节,不能凭空还原真实信息,这一点后面单独说。

推理跑在浏览器里,优先走 WebGPU。页面底部会显示当前用的是哪个后端,我这台机器上显示的是 WebGPU · Intel gen-12lp。如果设备没有可用的 WebGPU,它会自动降级到 WASM,多线程不行就再降到单线程 —— 能跑,但会明显变慢,界面上也会给出提示。

实测速度

拿截图里那张图举例(WebGPU,Intel 核显):

数值

尺寸变化

436×550 → 1744×2200(4 倍)

分块

20 块 · 单块 128 px · 重叠 8 px

单张耗时

约 18.7 秒

核显跑到这个速度,日常处理几张图完全够用。有独显的机器会更快;纯 CPU 的 WASM 路径会慢很多,这也是为什么建议用最新的 Chrome 或 Edge 打开。

哪些图效果好,哪些别指望

适合放大:分辨率不够的老照片、截图、二次元插画、AI 生成后尺寸偏小的图。这几类都是「有内容、只是像素少」,模型有东西可以重建。

别指望它:失焦的、糊掉的照片。超分是重建细节,不是修模糊 —— 一张对焦失败的图,放大之后只会得到一张更大、更清楚的糊图。抖动、噪点严重的图效果也一般。

另外两个硬限制

  • 输出有像素上限:输出到 64 兆像素就停。换算一下,4 倍大约能处理 2000×2000 的源图,2 倍大约 4000×4000。超了会直接报错,让你降低倍率或者先把图裁小。这是纯本地推理的必然代价 —— 没有云端兜底。

  • 图越大越慢:分块推理,块数随面积上涨,耗时基本是线性往上走。

原来的压缩和格式转换(没变)

压缩侧一点没动,还是原来的样子:拖进去,选格式(AVIF / WebP / JPEG / PNG / JPEG XL)和质量,实时出结果,支持批量:

blog image

压缩是纯编解码,没有上面那些像素上限,一次处理上百张也没问题。详细用法看上一篇,这里不重复了。

部署(和上一篇完全一样)

已经 fork 并部署过的读者,不用重来一遍:打开你自己那个仓库页面,点 Sync fork → Update branch,把最新代码同步过来就行。Cloudflare 检测到新提交会自动重新构建,几分钟后就是最新版本。

从头部署的话,流程一步没变,照抄上一篇:

① fork 到自己的仓库

项目地址:https://github.com/haihaipypy/image-tools

② Cloudflare 导入这个仓库

blog image

③ 填构建命令和输出目录

构建命令填 npm run build,输出目录填 dist

blog image

④ 添加自定义域名

blog image

有两点是这次要额外注意的:

  • 建议加一个环境变量 NODE_VERSION = 22。项目用的构建工具对 Node 版本有要求(^20.19.0 || >=22.12.0),构建镜像自带的版本不一定满足,加这个变量最省事。

  • 别删项目里的 _headers 文件。放大功能要靠它给页面加上两个跨域隔离响应头,才能真正跑起多线程推理;少了这两个头,没有 WebGPU 的机器会掉到单线程,慢好几倍。Cloudflare 会自动读取这个文件,你什么都不用改。

结尾

线上地址还是 https://img.1day.vip/ ,压缩和放大都在。

项目开源(MIT),压缩部分源自 Addy Osmani 的 image-tools,超分模型是 Real-ESRGAN(BSD-3-Clause),原始版权声明都保留着。有问题,或者想加别的模型,评论区说一声。

END