Я создаю сценарий для сбора нескольких значков, преобразования их в png и создания из них единого спрайтового изображения.
Полезный файл g.etfv.co будет обнаруживать и преобразовывать значкив формате PNG, и я использую PIL для монтажа изображений в лист спрайта.
Все это работает нормально, за исключением того, что при этом я теряю канал альфа-прозрачности.
Результирующее изображение из приведенного ниже сценария: .Обратите внимание на черные области, которые должны быть прозрачными.
Обновление: Теперь создается изображение в режиме «RGBA», а не «RGB».Результирующее изображение теперь только частично borked: .Значок 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)