透明底的 WebP 转成 JPG 后整张发黑或者主体边缘多出一圈脏方块,原因是转换工具把透明通道直接删了,透明区域里原本看不见的颜色全露了出来。修法只有一句:转之前先把图合成到白底或你最终要用的底色上再存 JPG。处理透明图的办法有四种:用 Mac 自带的 sips 或预览,用 ezgif、CloudConvert 这类在线工具,自己写脚本时先铺白底,或者干脆不转 JPG 改存 PNG(比如 libwebp 自带的 dwebp)。前两种默认就会铺白底。最容易出事的是脚本,因为最顺手的那种写法恰好就是直接删通道。手里是普通的不透明 WebP、又不想上传的话,电脑浏览器里的图映 ImgIng 也能在本地转。
商品图链路里透明底素材转 JPG 是绕不开的一步,有些下游环节只收 JPG。这种图转错了不报错也照样生成文件。往往要等页面上冒出一个黑方块才有人发现。这次我试了两张从维基共享资源找来的带透明 WebP。一张是 Joni Goodman 拍摄的 569×858 透明底椅子。另一张是 HFWMan 做的 211×211 黑线条动画时钟,它有 287 帧而我只取了第 1 帧。两张都是 CC BY-SA 4.0 许可。机器是一台 16 GB 内存的 Mac,日期 2026-10-22。文中 KB 按 1024 字节进位。
JPG 根本存不下透明
JPG 的每个像素只有红绿蓝三个数,没有地方记透明度。WebP 可以多带一个透明通道。它给每个像素多存一个 0 到 255 的值:0 是完全透明,255 是完全不透明,中间的是半透明。抠图边缘和线条两侧的抗锯齿用的全是半透明像素。从 WebP 转到 JPG 时这个值必须处理掉,工具能做的只有两件事。一种是先把图叠到一张纯色底上按透明度算出每个像素最终的颜色再存,这叫合成。另一种是把透明通道整个删掉,剩下的红绿蓝原样写进 JPG。第二种写起来最省事,问题也全出在它身上。
这两张样本的透明面积都不小。按像素数算,椅子那张七成多(70.9%)完全透明,半透明的边又占了 5.4%。时钟更夸张,完全透明的有 96.4%,半透明 2.9%。两张图大半面积上的颜色平时都被透明度盖着。
变黑和毛刺都是藏着的颜色露出来了

这张图只看最右边一列,那是 Python 的 Pillow 库直接转成 RGB 再存的结果。上面那把椅子的边缘外多出一块块像被脏手抹过的灰棕色方斑,这就是毛刺。下面那个时钟整张全黑,表盘和指针都看不见了。前三列的白底结果只是对照。椅子来自 Joni Goodman / Wikimedia Commons,时钟来自 HFWMan / Wikimedia Commons,许可都是 CC BY-SA 4.0,这张对比图同样按 CC BY-SA 4.0 共享。
完全透明的像素也存着红绿蓝,只是被透明度盖住了。时钟图藏着的颜色百分之百是黑色,表盘线条本身也是黑的。透明通道一删背景和线条就成了同一种黑,图上的信息全没了。椅子图藏着的颜色大多接近白(中位数是 254),乍一看也像白底。可它有 40,476 个完全透明的像素藏的不是白色,占全部完全透明像素的 11.7%。对照图上的位置看,那些方斑就是它们,都堆在椅子边缘外面。
透明的地方为什么会藏着灰棕色?WebP 官方编码工具 cwebp 有一个「保留透明区域原色」的选项,默认是关的。透明区域反正看不见。编码器就可以把那里的颜色改成更好压缩的样子,常见结果是把边缘的颜色往外抹开。这把椅子当初怎么编码的我查不到。我只能说现象和这个机制对得上。
半透明边缘是另一笔账。这些像素本该按透明度和背景混合。删掉通道后它们被当成完全不透明直接画出来,柔和的过渡就成了硬边。我按「透明度和白色精确混合」算了一张理想结果当基准再逐像素去对。直接删通道的那张在半透明边缘上平均差了 46.8 个色阶(满分是 255)。整张图上差值超过 48 的像素有 53,528 个。
铺白底再存后毛刺消失
脚本里的改法不复杂。先建一张和原图同样大小的纯白画布,再拿原图自己的透明通道当蒙版把原图贴上去,最后存 JPG。用 Pillow 就是新建一张白色的 RGB 图并在粘贴时把透明通道传给蒙版参数。这比原来的写法多两步,也不用加依赖。
两种写法我都用 Pillow 默认的质量 75 存,再拿同一张理想结果去比。椅子图上差值超过 48 的像素从 53,528 个降到 0 个。半透明边缘的平均偏差从 46.8 降到 7.9。透明区域的平均颜色从 235.9 左右回到 254.8 左右。文件反而从 55.4 KB 小到了 50.6 KB。时钟从全黑变回白底黑线,暗像素一共 900 个。原图里不透明度过半的线条像素是 822 个。多出来的是线条两侧那圈半透明。差值超过 48 的只剩 1 个像素。修好的两张再和 Mac 自带 sips 的输出比,平均每个通道只差 1.18 和 0.78 个色阶,并排放着我看不出区别。
体积也能当个报警信号。全黑的那张时钟只有 1,411 字节(约 1.4 KB),修好以后是 4,965 字节(约 4.8 KB)。转完小得反常的图我会先打开看一眼再说。这类脚本我改完都会先拿一张透明图和一张普通图各跑一遍。对着原图看过才放进批量任务。
Mac 自带的 sips 默认铺白底
Mac 上不用装任何东西。在终端里调用系统自带的 sips 命令。把输出格式参数设成 jpeg 再用输出参数指定新文件名,一条命令就转完了。实测椅子转出来 84,753 字节,时钟 7,498 字节。透明的地方都是白色,中位数正好是 255。拿时钟一对就知道它走的是合成那条路,底下藏着的那片黑一点都没露出来。
图形界面的做法是用「预览」打开 WebP,点「文件」菜单里的「导出」并把格式选成 JPEG 再存。预览和 sips 用的是同一套系统图像框架。我按 sips 的结果推断预览导出的透明图也会是白底,这次没有真的去点。
Windows 这边我没法替你确认。画图支不支持 WebP,微软官方文档里我没翻到明确说法。在微软社区里,用户的回答是拿画图打开 WebP,然后「另存为」JPEG;有人补了一句,没装 WebP 图像扩展的话画图可能打不开。我手上没有 Windows,画图会给透明处填什么颜色只能请你转完自己打开看一眼。
在线工具转换要先上传文件
ezgif 官网有专门的 WebP 转 JPG 页面。选文件上传、点转换再下载就行。透明的地方默认填白。选项里的 Background color 可以改成别的颜色。官网写的是单个文件上限 200MB 并在上传后 1 小时自动删除。CloudConvert 官网的步骤也差不多:选文件,目标格式选 JPG,转换后下载。透明处同样是白底。它的安全说明页写的是文件只为处理而保留并在处理完立即删除,下载链接带的签名 24 小时有效。两家我都没登录就直接用了。
在线工具的好处是哪个系统都能开而且结果也对。代价是文件要先传到对方的服务器上。我自己的习惯是还没公开的商品图不往外传。这两家只拿来处理公开素材。
要留透明只能改存 PNG
同一张图要贴在不同颜色的页面上时透明本身还要用,这时转 JPG 就选错了,应该换成 PNG。libwebp 自带的 dwebp 命令行工具能把透明 WebP 解成 PNG 并保留透明,缺点是要自己装。如果下游本来就收 WebP,那最省事的是原图不动,什么都不转。
普通图透明图动图分开处理
普通的不透明 WebP 是最好办的一类。不想上传、也不想碰终端的话,可以用图映 ImgIng。它在电脑浏览器里打开就能用,免费也不用注册。它的「压缩 转换」能读写 WebP,可以直接导出 JPG。界面上写着「原图不会上传」,我这次对着网络请求看了一遍,转换过程中确实没有上传请求。一批要转的话,它的批量压缩可以一次选多个文件或者整个文件夹,输出统一设成 JPG,处理完一张存一张。批量里选 JPG 时界面自己会提示「JPG 不支持透明背景;需保留透明时请选择 WebP 或 PNG」,所以透明图还是按前面的办法单独处理。它适合在电脑上处理、又不想把文件传出去的人。
| 手里的图 | 推荐做法 | 要注意什么 |
|---|---|---|
| 普通不透明的 WebP | sips 或预览、图映 ImgIng 本地转或用在线工具 | 各家默认画质不同时体积可能差好几倍 |
| 带透明但最后必须是 JPG | 先合成到底色再存,sips 和两家在线工具默认就铺白 | 底色要和最终放的地方一致;脚本别直接删通道 |
| 带透明且透明还要留着 | 改存 PNG(如 dwebp),下游收 WebP 就不转 | 不要硬转 JPG |
| 动图 WebP | 想留动画就别转 JPG | sips 和 Pillow 只留第 1 帧且不提示;ezgif 和 CloudConvert 拆成 287 张;dwebp 直接报错 |
动图那一行是两件事叠在一起。时钟本身就是一张带透明的动图。就算第一帧的底色处理对了剩下 286 帧也已经没了。
常见问题
转出来是白底,为什么边缘还有一圈发白?
合成到白底以后半透明的边缘就混进了白色。这张 JPG 放在白色页面上看不出来。放到深色背景上那一圈白就会显出来。这是合成本身的结果,深色页面的效果我没有专门测。办法是把底色换成最终要放的背景色:ezgif 改 Background color,脚本里把白色画布换成那个颜色。要么干脆用 PNG。
转之前怎么知道一张 WebP 有没有透明?
Mac 上可以用 sips 查询 hasAlpha 这个属性。实测椅子和时钟返回 yes,一张普通的花卉照片返回 no。批量处理前先按这个结果把图分开,透明的那些走合成或者 PNG。Windows 上的查法我没测。
底色能不能铺成黑色?
能。底色随便选但要和主体颜色拉开。时钟这种黑线条的图铺黑底等于又变回全黑。
转完文件特别小,是压得好吗?
不一定。上面那张全黑的时钟只有约 1.4 KB,正确的白底版本约 4.8 KB。体积小得反常时先打开确认图还在。