Python PIL - для всех областей PNG с непрозрачностью> 0 их непрозрачность установлена ​​на 1 - PullRequest
4 голосов
/ 18 ноября 2010

Представьте себе красный круг с черной тенью, которая исчезает поверх полностью прозрачного фона.Когда я открываю и сохраняю изображение с помощью PIL, фон остается полностью прозрачным, а тени становятся полностью черными.

Проблема возникает даже без изменения изображения:

image = Image.open('input.png')
image = image.convert('RGBA')
image.save('output.png')

Я хочу сохранитьизображение выглядит точно так же, как оригинал, так что я могу обрезать или изменить его размер.

РЕДАКТИРОВАТЬ: Вот PNG, который демонстрирует эффект.Он был преобразован в 8 бит с помощью PNGNQ.

alt text

При использовании приведенного выше кода Python получается следующее:

alt text

Ответы [ 2 ]

6 голосов
/ 20 ноября 2010

Похоже, что PIL в настоящее время не поддерживает полную альфа для PNG8.

Здесь есть патч для поддержки только для чтения: http://mail.python.org/pipermail/image-sig/2010-October/006533.html

Если вы чувствуете себя непослушным,Вы могли бы обезьяна PIL:

from PIL import Image, ImageFile, PngImagePlugin

def patched_chunk_tRNS(self, pos, len):
    i16 = PngImagePlugin.i16
    s = ImageFile._safe_read(self.fp, len)
    if self.im_mode == "P":
        self.im_info["transparency"] = map(ord, s)
    elif self.im_mode == "L":
        self.im_info["transparency"] = i16(s)
    elif self.im_mode == "RGB":
        self.im_info["transparency"] = i16(s), i16(s[2:]), i16(s[4:])
    return s
PngImagePlugin.PngStream.chunk_tRNS = patched_chunk_tRNS

def patched_load(self):
    if self.im and self.palette and self.palette.dirty:
        apply(self.im.putpalette, self.palette.getdata())
        self.palette.dirty = 0
        self.palette.rawmode = None
        try:
            trans = self.info["transparency"]
        except KeyError:
            self.palette.mode = "RGB"
        else:
            try:
                for i, a in enumerate(trans):
                    self.im.putpalettealpha(i, a)
            except TypeError:
                self.im.putpalettealpha(trans, 0)
            self.palette.mode = "RGBA"
    if self.im:
        return self.im.pixel_access(self.readonly)
Image.Image.load = patched_load

Image.open('kHrY6.png').convert('RGBA').save('kHrY6-out.png')
0 голосов
/ 19 ноября 2010

Я думаю, что проблема была несколько решена, но возможно ли, что вам нужно установить глубину альфа-канала?

...