Как я могу создать прозрачный держатель изображения в django? - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь создать прозрачный держатель изображения в python. Затем я хочу добавить изображения в держатель. Когда держатель изображения отображается на веб-странице, я хочу видеть изображения, но я хочу, чтобы держатель был прозрачным. Таким образом, я все еще смогу видеть исходную страницу за держателем изображения

Мой код выглядит следующим образом

def test_image():
    image_holder = PilImage.new('RGBA', (800, 200), (255, 0, 0, 0))
    test_image = PilImage.open('test_image.png')
    a_channel = PilImage.new('L', test_image.size, 255)
    test_image.putalpha(a_channel)
    image_holder.paste(test_image, (50, 100), test_image)
    image_holder.save('test_image_A.png')
    return test_image

Если я просматриваю изображение на веб-странице, оно отлично работает

<img src="my_imageA.png" width="800" height="232">

Но если я пропущу изображение через контекст django, image_holder отображается как красный

context['test_image'] = test_image()

Что я могу сделать?

1 Ответ

0 голосов
/ 14 июля 2020

Проблема заключалась в том, что я конвертировал изображение в JPEG для кодирования для JSON

def _encode_image(image):
    """Return image encoded to base64."""
    image = image.convert("RGB")
    io_buffer = io.BytesIO()
    image.save(io_buffer, format='JPEG')
    values = io_buffer.getvalue()
    encoded_image = ''.join(['data:image/jpg;base64,', base64.b64encode(values).decode()])
    return encoded_image

и, конечно, JPEG не поддерживает альфа-канал. Должно было быть

def _encode_image(image):
    """Return image encoded to base64."""
    image = image.convert("RGBA")
    io_buffer = io.BytesIO()
    image.save(io_buffer, format='PNG')
    values = io_buffer.getvalue()
    encoded_image = ''.join(['data:image/jpg;base64,', base64.b64encode(values).decode()])
    return encoded_image

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

...