PNG转ICO后透明背景变黑,是因为"透明"这件事在两种文件里存法不同。PNG 把透明度存在 alpha 通道里,每个像素除了 RGB 还有一个 0 到 255 的 alpha 值;ICO 支持 32 位(RGB 加 alpha),但也允许 24 位(只有 RGB)。一旦落到不含 alpha 的位深,那些 alpha 为 0 的像素就按记录的 RGB 显示,而透明像素的 RGB 通常是 0,也就是黑。

把一张透明底的 PNG 放在棋盘格背景上看,透明区显示的是棋盘格,不是黑,因为看图软件在读 alpha。但文件里那些像素的 RGB 是实实在在存着的,常见是 (0,0,0),或者与黑色预乘之后的值。丢掉 alpha 之后,剩下的就是那个 RGB。
这也解释了一个常见现象:同一个 ico,放进网页里标签栏显示正常,下载到本地用文件夹看却是黑底。网页那边读到了 alpha,本地那条路径没读。
图标边缘不是硬切,缩小时会算出 alpha 在 1 到 254 之间的过渡像素。这批像素在带 alpha 的档位里显示成渐隐,在不带 alpha 的档位里被当成不透明,颜色取的是 RGB,于是边缘多出一圈深色描边。
22 像素的图标看不出来,16×16 放大到 400% 就很明显。所以判断标准不是"打开像不像",是"放大到 400% 边缘是灰的过渡还是一条黑线"。
第一步,打开 PNG转ICO,左侧确认高亮的是「PNG转ICO」那一项,旁边还有 JPG转ICO、ICO转JPG、ICO转PNG。
第二步,「图标尺寸」先别用默认的 16*16,改成 48*48 或 256*256。旁边那行提示写着:原图宽高不一致时选择尺寸会造成画面变形,可先改原图尺寸。

第三步,点「点击选择文件」上传。单张 50M 以内,一次最多 60 张,但一次只出一档尺寸,要几档就转几次。
第四步,下载后做一次对照:把 ico 拖进浏览器新标签看一次,再在文件夹里切到大图标视图看一次。两处看到的不一样,就是位深不同造成的。
第五步,边缘发黑的那一档,回退两个做法。换更大的尺寸重转,让过渡像素的比例降下来;或者先用图片裁剪把 PNG 的透明边裁掉 1 到 2 像素,让边缘落在实色上,再转。
favicon 最终显示在浏览器标签栏上,那个位置的底色由浏览器主题决定:浅色主题白底,深色主题深灰。与其赌透明,不如做一版白底、一版深灰底,各转一个 ico,按主题切换。
电商和公众号用的图标同理。落在固定底色上的图标不会出这类问题,只有需要浮在任何背景上的图标才值得为 alpha 折腾。
同一个 ico 在不同地方显示不一样,是文件坏了吗?
不是。ICO 是一个容器,可以同时装 16、32、48、256 几档,每档的位深也可以不同。不同程序按自己需要的尺寸取不同档,看到的效果自然不同。
转成 ico 之后还能改回 png 吗?
能,ICO转PNG就在同一个页面的左侧列表里。但丢掉的 alpha 不会自己回来,转回去还是黑底,得从原始 PNG 重做一遍。
为什么 16×16 档最容易出问题?
256 个像素里,边缘过渡要占掉几十个。比例一大,丢 alpha 之后的黑边就藏不住了。尺寸越小,越要靠实色边缘。
PNG转ICO后透明背景变黑,问题不在转换本身,在于那一档有没有带 alpha。转之前先把尺寸定大,转完放大到 400% 看边缘,比事后反复重转省事。