Сделайте PNG спрайты в PIL, но хотите сохранить альфа-канал - PullRequest
0 голосов
/ 19 сентября 2011

Я создаю сценарий для сбора нескольких значков, преобразования их в png и создания из них единого спрайтового изображения.

Полезный файл g.etfv.co будет обнаруживать и преобразовывать значкив формате PNG, и я использую PIL для монтажа изображений в лист спрайта.

Все это работает нормально, за исключением того, что при этом я теряю канал альфа-прозрачности.

Результирующее изображение из приведенного ниже сценария: enter image description here.Обратите внимание на черные области, которые должны быть прозрачными.

Обновление: Теперь создается изображение в режиме «RGBA», а не «RGB».Результирующее изображение теперь только частично borked: 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 голосов
/ 19 сентября 2011

Полученное изображение inew не имеет альфа-канала.

UPDATE:

попробуй

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