图片加工避坑:主图800×800、封面2MB、WebP压缩,参数和踩坑记录都在这

关键词:图片加工,图片压缩不失真,批量修改图片尺寸,图片转WebP,图片DPI

摘要:从一个4.7G、2637张银饰原图的返工经历说起,把淘宝主图、公众号封面、小红书、证件照的尺寸参数,ImageMagick 和 Pillow 的可用命令、EXIF 隐私坑、DPI 迷思、JPEG 质量 82 的来历,一次性写清楚。

去年十一月我接了个活,帮一个做银饰的工作室整理详情页。客户发来一个 4.7G 的压缩包,解压出来 2637 张图,全是 iPhone 12 Pro 拍的,文件名从 IMG_0001 排到 IMG_2637。我点开第一张:4000×3000,4.2MB。

图片

当时我第一反应是这得修到什么时候,第二反应才是——里面真正需要“修”的其实没几张。大部分图的问题只是太大了、比例不对、格式不对、色彩空间不对,跟好不好看一点关系都没有。

后来我想明白了。绝大多数讲图片加工的教程,一上来就跟你聊曲线、通道、液化,但普通人真正被卡住的地方都在“交付”那一步:平台说主图必须 800×800 白底,公众号说封面别超过 2MB,甲方说你这图我微信里打不开。这些全是规格问题,不是审美问题。规格搞不清,你把图修成杂志封面也没用。

一、先把参数抄下来,这比学修图软件划算多了

场景 像素尺寸 比例 文件大小 格式
淘宝/天猫主图 800×800 起,推荐 1200×1200 1:1 ≤3MB,我一般压到 300KB 内 JPEG
淘宝第五张白底图 800×800 1:1 同上 JPEG
京东主图 800×800,推荐 1200×1200 1:1 ≤1MB JPEG
微信公众号封面首图 900×383 2.35:1 ≤2MB JPEG/PNG
公众号正文配图 宽 1080 任意 ≤5MB JPEG
小红书 1242×1660(或 1080×1440) 3:4 ≤20MB JPEG
抖音全屏封面 1080×1920 9:16 无硬性 JPEG
朋友圈单图 宽 1080 4:3 或 1:1 无硬性 JPEG
闲鱼 1000×1000 以上 1:1 无硬性 JPEG
一寸证件照 295×413 5:7 — JPEG
二寸证件照 413×579 5:7 — JPEG
A4 印刷(300dpi 满版) 2480×3508 1:1.414 — TIFF/PDF

说明几点。

一是这些数字不是死的,平台会改,而且经常改。表格里京东主图 ≤1MB 是我最后一次核对时的要求,你真要做之前最好去后台翻一眼,别信任何教程,包括这篇。

二是“推荐尺寸”和“最低要求”完全是两回事。淘宝主图最低 800×800,但你真传 800×800 上去,在详情页大图轮播里就是会比别人糊一圈。我的习惯是一律按 1200×1200 出,这样手机端双指放大还扛得住。

图片

三是比例比尺寸重要。小红书你传 1080×1440 还是 1242×1660,观感几乎没差别,但你传个 1:1 的方图上去,它会自动给你裁成 3:4,两边的人物就被切掉了。裁图这事得自己裁,别交给平台。

二、三条路线,我劝你别一上来就开 PS

在线工具(TinyPNG、Squoosh、iLoveIMG 这类)。优点是快、零门槛、拖进去就完事。问题有三个:一,一次传几十张浏览器就开始卡,2637 张你能点到手抽筋;二,你根本不知道它背地里做了什么——我有一次图省事,拿某个在线站压了 300 张首饰图,第二天发现它默认给我加了锐化,银饰的高光全爆了,边缘一圈白边,返工干到凌晨两点;三,客户未发布的产品图传上去,等于把商业信息拱手交给别人的服务器。我现在给自己定的规矩是:客户的图,一张都不上传。

Photoshop 动作 + 批处理。适合步骤固定的活,比如“缩到 1200 + 加 4px 白边 + 轻微锐化 + 存 JPEG”。但对两千张这个量级,PS 是真的慢,而且中途随便弹一个“是否覆盖”或者“找不到字体”的对话框,你前面排队等待的时间全白费。另外 PS 从 CC 2021 之后把“存储为 Web 所用格式”挪进了“导出为”,参数逻辑变了,网上大量老教程对不上号,照着做会一脸问号。

命令行(ImageMagick / ffmpeg / Python Pillow)。学习成本大概半小时,但处理两千张时的速度和稳定性是碾压级的。那 2637 张,我写了几行命令,跑了六分多钟,中间去泡了杯茶。

ImageMagick 最常用的几条:

# 批量缩成 800×800 白底正方图
magick mogrify -path ./out -resize 800x800^ -gravity center -background white -extent 800x800 -quality 82 -strip *.jpg



![图片](http://img0.baidu.com/it/u=1645221720,2481731662&fm=253&fmt=auto&app=138&f=JPEG?w=750&h=500)


# 批量转 WebP
magick mogrify -path ./webp -format webp -quality 78 -define webp:method=6 *.jpg

# 只清 EXIF,尺寸不动
magick mogrify -strip *.jpg

800x800^ 那个尖号是“填充”模式,意思是缩放到能填满 800×800 为止,多出来的部分交给 -extent 裁掉。不加尖号就变成“缩放至能装进去”,出来的图会留白边。这个符号我一开始死活记不住,用错过两次。

如果要做更精细的控制,比如按主体位置裁、保留或重写元数据,就上 Pillow:

from PIL import Image, ImageOps
from pathlib import Path

src, dst = Path("in"), Path("out")
dst.mkdir(exist_ok=True)

for p in src.glob("*.jpg"):
    im = Image.open(p)
    im = ImageOps.exif_transpose(im)      # 先把旋转信息烧进像素
    im = im.convert("RGB")                # 去掉 alpha 和 CMYK
    im = ImageOps.fit(im, (1200, 1200), method=Image.LANCZOS, centering=(0.5, 0.5))
    im.save(dst / f"{p.stem}.jpg", "JPEG", quality=82, optimize=True, subsampling=1)

图片

ImageOps.exif_transpose 这一行是很多人会漏掉的。手机竖着拍的照片,像素其实是横的,方向信息写在 EXIF 里。你用命令行批量缩图,EXIF 被 strip 掉之后,所有竖图都会躺下来。这个坑我踩过,350 张商品图集体躺平,重做的时候我盯着屏幕愣了半分钟。

三、“DPI 到底 72 还是 300”,这问题基本在浪费时间

简单说,对屏幕而言 DPI 就是个写在文件里的数字,改它不会让图变清晰。一张 295×413 的照片,你标成 72dpi 还是 300dpi,在手机屏幕上显示出来一模一样。真正决定清晰度的只有像素数,没有别的。

唯一需要认真管 DPI 的场景是送印刷厂。这时候的换算公式是:像素数 = 物理尺寸(英寸)× DPI。A4 是 210×297mm,加 3mm 出血变成 216×303mm,换算成英寸大约是 8.5×11.9,乘 300 就得到 2551×3579 像素。印刷厂跟你说“300dpi 以上”,你直接给 2480×3508 就能过。

但有个例外我得提一句:某些电商 ERP,还有早年那版淘宝助理,会去读 EXIF 里的分辨率字段来判断你这张图“算不算高清”,你标 72dpi 它就把你打回。这不是技术原因,是写后台的人偷懒。碰上这种,你就把 DPI 元数据改成 300 糊弄过去:

magick mogrify -strip -units PixelsPerInch -density 300 *.jpg

注意顺序,-strip 必须写在 -density 前面。反过来的话,你辛辛苦苦设的分辨率会被 -strip 一起清掉,等于白干。我自己是只在需要过 ERP 的那批图上保留 DPI,其余的统统 strip 干净。

图片

四、压缩不失真,参数就那么几个

JPEG 质量我固定用 82。低于 75,人像的皮肤和渐变天空会开始出现块状和色带;高于 90,体积涨得飞快,但眼睛基本看不出区别。82 是我测了很多次之后觉得最划算的那个点。一张 1200×1200 的 JPEG,质量 82 加上 subsampling 4:2:2,大约落在 180~260KB 之间。

WebP 同画质一般还能再小 25%~35%,但它有个前提:你的下游认不认。微信公众号和淘宝主图现在还是收 JPEG 和 PNG,你传 WebP 上去它直接报错。WebP 适合的是你自己的网站、App 或者公司内网这类你能控制的地方。

PNG 只用在三种情况:透明背景、纯色块、带文字的截图。照片存 PNG 是灾难,一张 1200×1200 的照片存成 PNG 能到 3MB,而且肉眼看不出任何好处。也别把照片存成 PNG-8,会有明显色带,天空和肤色过渡的地方尤其明显。

色彩空间统一转 sRGB、8 位。相机和设计软件默认可能是 Adobe RGB 或者 ProPhoto,在本地看颜色更“厚”,但绝大多数浏览器和 App 是按 sRGB 解释的,你传上去就发灰。这事在设计圈吵了很多年,到现在还有人在踩。

还有一个顺序问题很多人搞反:锐化要在缩小之后做。缩图本身会损失锐度,你缩小之前锐化,缩完就等于白锐。正确顺序是先缩尺寸,再做一次很轻的锐化。ImageMagick 里是这样:

magick mogrify -path ./out -resize 1200x1200 -unsharp 0x0.75+0.75+0.008 -quality 82 *.jpg

图片

那个 0x0.75+0.75+0.008 是半径 0、sigma 0.75、强度 0.75、阈值 0.008,一套用久了的网页锐化参数,够轻,不容易出白边。

五、收尾:EXIF、命名、备份

-strip 这个参数我要单独说。手机拍的照片里带着 GPS 坐标、设备型号、拍摄时间。你把这些原图发到网上、挂到二手平台,等于顺手把家庭住址报了一遍。我之前随手用工具读了一个闲鱼卖家的商品图,直接读出了他家小区的经纬度。真的别偷懒。

命名也别马虎。别用中文,别用空格,别用 # & ? 这类字符——中文名在部分平台上会变乱码,空格在命令行和 URL 里都要额外转义,& 在 URL 里会直接把参数截断。我的习惯是 sku-0001.jpg 这种,四位补零,排序不会乱:

n=1; for f in *.jpg; do mv "$f" "$(printf "sku-%04d.jpg" $n)"; n=$((n+1)); done

最后一条,也是最重要的一条:改图之前先备份原图。我把它放最后写,但它是我做这行的第一条规矩。批量命令最可怕的地方在于它不会问你“确定吗”,它只会默默地把 2637 张图按你的错误参数全部覆盖一遍。我第一次用 mogrify 的时候不知道它默认是原地覆盖,等反应过来,整个文件夹的原图已经全变成 800×800 了。

从那以后我养成了一个习惯:所有批量命令,第一遍一定加 -path ./out 输出到新目录,肉眼抽查十张,确认没问题了,再考虑要不要原地处理。而且说实话,很多时候根本不需要原地处理。硬盘现在便宜得很,多留一份原图,比什么参数都强。

标签: