1099 字
5 分钟

Pressly:逆向 docsmall 的无广告图片压缩站

2026-07-24
gemini-aiAI 摘要

前言#

目前提供在线图片压缩的网站不少,但要么得登录,要么有免费限额,要么满屏牛皮癣广告,再加上图片上传慢、下载更慢,体验一言难尽。

docsmall是我目前发现的最好用的在线压缩网站——支持 JPG / PNG / WebP 多种格式,完全在浏览器端完成压缩,不用上传服务器。无论速度还是效果都非常优秀。缺点嘛……就是接入了谷歌广告,而且还会反检测广告屏蔽器,只要检测到自己的广告被屏蔽就会无限弹窗提醒,非常影响体验。

我之前试着用 Kimi k2.7 从头 vibe coding 一个图片压缩站点,结果做出来的东西不仅压缩缓慢,内存占用更是离谱——一张 8MB 的图片丢进去压缩居然要占用 4GB 内存。跟 AI 来回扯皮半天,始终没能解决。

图片压缩看似简单,实际上相关的开源项目和算法工具已经满天飞了,效果参差不齐,很难判断该用哪个。既然正面硬刚不行,那就换个思路——我又想起了 docsmall:它效果出众,又完全在浏览器端完成压缩,所有逻辑都暴露在前端代码里,简直是一个天然的逆向对象。于是决定直接逆向它的实现,摸清底层调用方式,再让 AI 照着规格复刻。

抓包确认架构#

打开网站,F12 → Network,上传一张图片并点击压缩,观察请求列表——没有图片上传请求,唯一的网络请求只是按图片格式加载对应的 WASM JS 文件。纯前端压缩,实锤了。

拆解三个编码器#

在 Network 面板中筛选 .js 请求,很快锁定了三个核心编码器:

格式WASM 文件体积来源
JPEGcdn.docsmall.com/wasm/cjpeg.min.js~1MBEmscripten 编译的 mozjpeg
PNGcdn.docsmall.com/wasm/pngquant.min.js~800KBpngquant 量化器
WebPdocsmall.com/_nuxt/webp_enc_simd-DbPpnQ0e.js~500KBlibwebp,藏在 Nuxt 构建产物里

调用方式#

三个编码器的接口风格各不相同:

mozjpeg

const result = cjpeg(inputBytes, ["-quality", "75"]);
// result.data → Uint8Array

pngquant

const result = pngquant(inputBytes, { quality: "0-70" }, function(){});
// result.data → Uint8Array

libwebp

const encoder = await self.WebPEncWasm();
const result = encoder.encode(imageData.data, width, height, {
quality: 75,
method: 4, // 编码速度/质量权衡 (0-6)
});

质量档位映射#

表面上只是从四档压缩级别里选了一个,但背后的参数映射远比想象中复杂:

级别JPEG (quality)PNG (quality)WebP
轻微850-10075(固定)
标准750-7075(固定)
强力500-4075(固定)
极致200-2075(固定)

值得注意的是:WebP 实际只有 75 一档质量,四档按钮对它形同虚设;PNG 的 quality 是范围格式(如 0-70),与 JPEG 的单值逻辑截然不同。三种格式后面是三套完全不同的参数体系。

SIMD 检测#

WebP 编码器还有一个细节:加载前会检测浏览器是否支持 WASM SIMD 指令集,根据结果选择加载 SIMD 加速版或普通版:

async function supportsSIMD() {
try {
return WebAssembly.validate(new Uint8Array([
0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11
]));
} catch { return false; }
}

原理很简单:构造一段包含 SIMD 指令的最小 WASM 二进制,用 WebAssembly.validate 测试能否通过校验。

交给 AI 干活#

到这里,三个编码器的调用方式、参数映射、SIMD 检测逻辑全部拆清楚了。接下来丢给 AI,让它输出完整的 Vue 3 项目代码。有了技术路线指引做约束,这下总出不了差错了。

此外不得不推荐 UI UX Pro Max skills,这次使用了里面 Spatial UI(VisionOS)的设计语言:

  • 玻璃材质面板(backdrop-filter: blur() saturate()
  • 深色渐变背景 + 径向光晕做空间深度
  • 三级阴影层级(float / elevated / deep)
  • hover 缩放 1.02、按压 0.98 的微交互
  • 三级圆角(窗口 24px / 面板 16px / 控件 12px)

正好最近阿里的 Qoder 活动,这次我也尝试了一波 Qwen3.8,前端进步确实可以,主要是 Qwen3.8 晚上0.2折这招实在太狠了,本项目全程消耗大约了 39 credits,主要是 UI 方面的微调。

最终复刻出的网站效果如下:

网页页面效果:

图片压缩效果:

在文件体积减少60%的情况下,压缩后的图片质量损失肉眼几乎无法分辨。

这个站点我命名为 Pressly,网站地址:pressly.tianhw.top,欢迎使用!

项目全部源码:

H2O-ME
/
pressly
Waiting for api.github.com...
00K
0K
0K
Waiting...
Pressly:逆向 docsmall 的无广告图片压缩站
https://blog.tianhw.top/posts/pressly/
作者
THW
发布于
2026-07-24