为什么我的透明 PNG 变成黑色了?

Why Nov 1, 2026 4 min read

你有一个透明背景的 logo。你上传它、或转换它、或把它放进一份文档,然后透明的部分变成一块实心黑色矩形。那个文件刚才明明好好的。

没有任何东西损毁。过程中某个环节必须决定“透明的地方要放什么”,而它选了黑色。

Alpha 通道,以及缺少它的格式

一个透明的 PNG 每个像素存四个值:红、绿、蓝,以及 alpha——那个像素有多不透明。alpha 为零代表完全透明,而那里的颜色值通常没有意义,往往就留成零。零红、零绿、零蓝,就是黑色。

JPEG 完全没有 alpha 通道。它无法表示“这里什么都没有”。所以把一张透明 PNG 转成 JPEG 会逼出一个决定:每一个透明像素都必须变成某个真实的颜色。

一个谨慎的转换器会问你,或者默认填白色。一个草率的则直接丢掉 alpha 通道、留下底下原本的颜色值——而如上所述,那通常是零。黑色就是从这里来的。它不是刻意选了黑色;它是没有做选择。

它会在哪里咬你

解法:刻意地压平

可靠的做法是自己做那个决定,而不是留给下一个碰到这个文件的软件。

在转换之前,把图片放在一个你要的颜色的实心背景上,然后压平。接着再转换。现在没有透明可以丢失,下游也没有任何工具需要做选择。

要哪个颜色取决于它要去哪。多数文档和浅色页面用白色,预览卡片用你的品牌色,如果你知道实际的页面背景就用那个。重点是你选了它,一次,而且是知情的。

而在透明真的被支持的地方——一个网站、一个 App 界面——就留着 PNG,根本不要转。这个问题只存在于“有 alpha 的格式”遇上“没有 alpha 的格式”的那个交界。

哪些格式支持透明

GIF 的一位透明与难看的光晕

GIF 支持透明,但只是一个开关:每个像素不是完全透明就是完全不透明。没有中间。

这件事要紧,因为平滑的边缘仰赖部分透明。一个曲线的 logo 边缘,是由 30% 不透明、60% 不透明……这样的像素画出来的,和后面的东西融合。GIF 存不了那些,所以每一个都变成不是实心就是不见。

结果就是 GIF logo 那种锯齿、硬边的样子,以及那个恶名昭彰的白色光晕:如果图片是在白底上做的,半透明的边缘像素会被四舍五入成不透明的白,于是 logo 抵达深色页面时戴着一圈淡淡的边。

没有任何设置能修好这个。这就是格式本身。用 PNG 或 WebP。

反过来的同一个问题:淡色边

偶尔一张有正常 alpha 的 PNG,在深色背景上还是会显出一圈浅色轮廓。这是一个相关的缺陷:那些边缘像素在制作图片时就已经和白色混合过了,而那个白被烤进了半透明像素的颜色值里。

解法在上游——从原始稿件重新导出一次,在透明或同样深色的背景上。一旦那圈边进了像素里,没有任何转换能移除它。

寄出去之前的检查

两个快速测试,几乎能抓到全部:

速查

快速解决你的文件问题: 图片格式转换 立即免费使用 — 图片格式转换 →