Прозрачность не работает последовательно при сохранении GIF в PIL

1

Я работаю над скриптом, который записывает изображения и делает фон прозрачным. Вывод должен быть в формате GIF.

Скрипт работает, но для определенных изображений прозрачность не работает должным образом.

Вот сценарий

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

CANVAS_HEIGHT = 354
CANVAS_WIDTH = 344


def get_text_mask():
    font_style_path = 'Ultra-Regular.ttf'

    text_mask_base = Image.new('L', (CANVAS_WIDTH, CANVAS_HEIGHT), 255)
    text_mask = text_mask_base.copy()
    text_mask_draw = ImageDraw.Draw(text_mask)
    font = ImageFont.truetype(font_style_path, 94)
    text_mask_width, text_mask_height = text_mask_draw.multiline_textsize("1000\nUsers",
                                                                          font=font)

    text_mask_draw.multiline_text(((CANVAS_WIDTH - text_mask_width) / 2,
                                   (CANVAS_HEIGHT - text_mask_height) / 2),
                                  "1000\nUsers",
                                  font=font,
                                  fill=0,
                                  align='center')

    return text_mask


def run():
    images = ['image1.png', 'image2.png']
    for index, original_image in enumerate(images):
        image = Image.open(original_image)
        blank_canvas = Image.new('RGBA', (CANVAS_WIDTH, CANVAS_HEIGHT), (255, 255, 255, 0))
        text_mask = get_text_mask()
        final_canvas = blank_canvas.copy()
        for i in xrange(0, CANVAS_WIDTH, image.width):
            for j in xrange(0, CANVAS_HEIGHT, image.height):
                final_canvas.paste(image, (i, j))

        final_canvas.paste(text_mask, mask=text_mask)
        final_canvas.convert('P', palette=Image.ADAPTIVE)
        final_canvas.save("output-{}.gif".format(index), format="GIF", transparency=0)

run()

Изображение 174551 image1.png

Изображение 174551 image2.png

И шрифт находится здесь https://bipuljain.com/static/images/Ultra-Regular.ttf

И выход с вопросом. Изображение 174551

И выход работает нормально. Изображение 174551

Теги:
python-imaging-library
gif
transparency

1 ответ

1

Проблема в том, что ваше "исходное изображение" содержит тот же индексный цвет, что и GIF, чтобы обозначить "этот пиксель прозрачен".

Gif - это "палитра" - один индекс в этой палитре обозначается как "это прозрачно" (см. Fe https://en.wikipedia.org/wiki/GIF)

Поэтому, если вы укажете pure black или pure white как индекс цвета, который является прозрачным, а ваш исходный код уже содержит пиксели с этим точным цветом, они также становятся трансперентными.

Чтобы этого избежать, вы можете попробовать исходное фоновое изображение и выбрать "несуществующий" цвет в качестве прозрачного цвета - это никогда не попадет в ваш результирующий образ.

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

  • 0
    Какие-нибудь примеры кодовых указателей или ссылок?
  • 0
    @BipulJain этот SO-post выполняет замену пикселя на PIL. Изменение значения цвета пикселя в PIL - я мало что сделал в PIL - просто немного знаю о графических форматах
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню