在PIL中制作PNG精灵但想保留透明通道
我正在写一个脚本,用来抓取一堆网站的图标,把它们转换成PNG格式,然后把所有图标合成一张大图。
我用的工具g.etfv.co可以检测并转换这些图标为PNG格式,而我使用PIL库把这些图片拼接成一个大图。
这个过程基本上都很顺利,但我发现合成后图像的透明部分好像都消失了。
下面这个脚本生成的图像:。注意那些本该是透明的地方变成了黑色。
更新:现在我把图像模式改成了'RGBA',而不是'RGB'。生成的图像现在只有部分出错:。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))