图片批量处理

攒了几十张图要统一规格,一次拖进来全部处理完,再打包下载。

多选、整个文件夹拖进来都行,一次最多 60 张。队列是串行处理的,一张处理完就释放,所以内存峰值只和最大那张图有关。

把图片拖进来,一次最多 60 张

批量处理要留心的地方

处理顺序会影响体积。这一批里五个动作的先后是固定的:先裁剪(去掉多余像素,后面所有运算都更省)、再缩放、再加水印、最后编码和压缩。顺序反过来的话,水印会跟着缩放一起被缩放,字号就不可控了;先压缩再缩放则等于把画质损失做了两遍。批量处理没有交互式微调的机会,所以顺序一定要在开始前就想清楚。

一次处理多少张要看内存。每张图在内存里是「宽 × 高 × 4 字节」,一张 1200 万像素的照片就是 48 MB,加上原图副本、画布和输出缓冲,单张峰值可能上到 200 MB。队列如果一次把所有图都解码进来,二十张就能把标签页撑到几 GB 然后崩掉。所以这里是串行处理:一张处理完、释放掉、再开下一张,用时间换内存。

命名模板决定文件是不是会被覆盖。如果模板里只有 {width} 或 {date} 这种不含原名的占位符,一集合照就会互相覆盖,最后只剩一张。安全做法是模板里一定保留 {name},需要统一顺序时再拼上 {index}。这里还会额外做一次重名检查,重复的自动加 -2、-3,但来源不同的文件最好还是在模板里区分开。

按目标体积压缩是反复试出来的。编码后的体积和画质参数不是线性关系,没法一次算出「多少质量刚好 200 KB」。常见做法是二分:先按 0.8 编一次看体积,大了就把质量降到 0.6,小了就升到 0.9,来回几次到目标附近。本地批量处理可以不追求精确命中,先按统一质量出一批,个别超标的再单独处理更省时间。

批量下载可能被浏览器拦。一个页面短时间内连续触发几十次下载,浏览器会弹「是否允许下载多个文件」,用户点了拒绝后面的就都存不下来。更稳的做法是把结果打包成 zip 一次性下载,或者逐张确认后再点下一张。这里保留单张下载按钮,数量多的时候建议用压缩包。

同一批参数重跑一遍结果应该一致。批量处理最怕的是「同一套参数两次跑出来不一样」。这里除了水印和噪点之外所有操作都是确定性的,同一张图跑两次得到的字节完全相同,因此可以放心重跑。如果有文件处理失败,直接重跑整批、用命名去重覆盖,不用担心结果漂移。