Web Worker 可将图片压缩与滤镜计算移至后台线程,避免阻塞主线程;需通过 transferable 的 Uint8ClampedArray 传输像素数据,Worker 中用纯 JS 实现缩放、滤镜等算法,并分离卷积、分块处理优化性能。

用 Web Worker 把图片压缩和滤镜计算挪到后台线程,页面主线程就不再被阻塞,滚动、点击、动画都能保持流畅。关键不是“能不能做”,而是怎么传数据、怎么写算法、怎么把结果安全地交还给 UI。
Worker 里不能直接操作 DOM 和 Canvas
Web Worker 运行在独立线程,没有 window、document、CanvasRenderingContext2D 等浏览器 API。所以不能在 Worker 里 drawImage 或 getImageData —— 得靠主线程提前把图片转成可传输的数据(比如 ImageData 的 data 数组),再发给 Worker 处理。
- 主线程用 canvas.getContext('2d').getImageData() 提取像素数组(Uint8ClampedArray)
- 把 width、height 和 data 一起 postMessage 发过去(data 可以 transfer,零拷贝)
- Worker 收到后纯 JS 计算:缩放、灰度、高斯模糊、锐化等,只操作像素值
- 处理完再把新 data 发回主线程,用 putImageData 渲染到 canvas
压缩图片要自己实现缩放 + 量化,别依赖 toBlob
toBlob 是主线程方法,且内部可能触发同步编码(尤其大图),不能放进 Worker。得在 Worker 中手动实现:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 双线性缩放:按目标宽高重采样像素,比简单取整更平滑
- YUV 转换或 RGB 降采样:比如只保留 R/G/B 每第二个字节,减小体积
- 简单量化压缩:如将 0–255 映射为 0–63(低精度),再 pack 成 Uint8Array
- 如果需要 JPEG 编码,可用开源库如 jpeg-js(纯 JS 实现,支持 Worker)
滤镜用逐像素函数,避免嵌套循环卡死 Worker
Worker 虽不阻塞 UI,但若单次计算太久(比如 1000×1000 图做 5px 高斯模糊),仍会延迟响应。优化要点:
立即学习“前端免费学习笔记(深入)”;
- 用 一维数组遍历替代 for y { for x },减少 JS 引擎开销
- 高斯模糊改用 分离卷积:先水平扫一遍,再垂直扫一遍,复杂度从 O(n⁴) 降到 O(n³)
- 复杂滤镜(如油画、水彩)可分块处理,每处理 1 万像素 postMessage 一次进度
- 用 self.onmessage 接收指令,支持中止(通过标志位 + 定期检查)
通信和内存要小心:用 transferable + 类型数组
大图的 ImageData.data 动辄几 MB,直接 postMessage 会深拷贝,慢且耗内存。必须用 transfer:
- 主线程发送:worker.postMessage({ width, height, data }, [data.buffer])
- Worker 收到后 data 就变成 detached,不能再读原数组,但可新建 Uint8ClampedArray(view) 操作
- 返回时同样 transfer 新的 data.buffer,避免重复分配
- 别在 Worker 里长期缓存大数组,用完及时 let data = null

















