Подтвердить что ты не робот

Определение прозрачности GIF в Python

Как я могу проверить, является ли GIF прозрачным (даже частично)?

Я выполнил это с помощью PNG, открыв изображение с помощью PIL и проверив режим изображения. Но GIF имеют одинаковый режим независимо.

Что касается ложных срабатываний, я не возражаю, если полностью непрозрачный GIF будет помечен как прозрачный (при условии, что это редкий случай), но я не против, если прозрачный GIF будет помечен как непрозрачный.

Что касается библиотек, я бы предпочел решение, которое использует PIL, а не что-то другое, но что-то работает.

4b9b3361

Ответ 1

img = Image.open(filename)
if img.mode == "RGBA" or "transparency" in img.info:
    # image uses transparency

См. здесь о том, как прозрачность работает с GIF (и 8-битными, палитрованными, PNG).

Обратите внимание, что ваш фальшивый положительный случай возможен: GIF может определить цвет как прозрачный, но не использовать его. Я предполагаю, что это было бы довольно редко, но зачем же выбрасывать цвет для прозрачности и не использовать его? (Ваш ложный минус невозможен.)

Тем не менее, если вам нужно знать, действительно ли прозрачность используется, вы можете сделать две версии изображения, в которых прозрачный цвет отображается на разные цвета (например, черно-белый), а затем сравнивает их. Если есть какие-либо различия, изображение использует прозрачность. Например:

def uses_transparency(filename):
    img = Image.open(filename)
    trans = img.info.get("transparency", None)
    if trans is not None:
        trans *= 3  # convert color number to palette table index
        palette = img.getpalette()
        imgs = []
        for bg in [0, 255]:   # map transparent color first to black, then white
            palette[trans:trans+3] = [bg] * 3
            img.putpalette(palette)
            imgs.append(img.convert("L"))
        return bool(ImageChops.difference(*imgs).getbbox())

Можно использовать аналогичный подход, чтобы увидеть, использует ли 24-битный PNG альфа-канал, вставляя его на белый и черный фон и сравнивая результаты.