在PIL中制作PNG精灵但想保留透明通道

0 投票
1 回答
1244 浏览
提问于 2025-04-17 02:33

我正在写一个脚本,用来抓取一堆网站的图标,把它们转换成PNG格式,然后把所有图标合成一张大图。

我用的工具g.etfv.co可以检测并转换这些图标为PNG格式,而我使用PIL库把这些图片拼接成一个大图。

这个过程基本上都很顺利,但我发现合成后图像的透明部分好像都消失了。

下面这个脚本生成的图像:enter image description here。注意那些本该是透明的地方变成了黑色。

更新:现在我把图像模式改成了'RGBA',而不是'RGB'。生成的图像现在只有部分出错:enter image description here。OKCupid的图标看起来正常,但stackoverflow的图标还是丢失了透明通道。

更新:我注意到,出问题的图像在转换前都是RGB格式(而不是RGBA)。

>>> print url, img.getbands()
http://stackoverflow.com/ ('R', 'G', 'B')
http://www.google.com/ ('R', 'G', 'B')
http://blog.okcupid.com/ ('R', 'G', 'B', 'A')

我哪里做错了呢?

import urllib
import PIL.Image
import StringIO

favicon_base = 'http://g.etfv.co/'

icons = """
http://stackoverflow.com/
http://www.google.com/
http://blog.okcupid.com/
"""

icons = [icon.strip() for icon in icons.strip().splitlines()]

left = 0
right = 16
upper = 0
lower = 16

inew = PIL.Image.new('RGBA',(len(icons)*16,16))

for url in icons:
    favicon = urllib.urlopen(favicon_base + urllib.quote(url) + '?defaulticon=lightpng').read()

    img = PIL.Image.open(StringIO.StringIO(favicon))
    img = img.convert('RGBA')

    bbox = (left, upper, right, lower)
    inew.paste(img, bbox, img)

    left += 16
    right += 16


inew.save(open('blah.png', 'wb'), 'png', optimize=1)

1 个回答

0

结果图像 inew 没有透明通道。

更新:

试试

inew = PIL.Image.new('RGBA',(len(icons)*16,16))

撰写回答