Top.Mail.Ru

Написание фильтров в Django с генерацией изображений

Написание фильтров в Django с генерацией изображений

Фильтры — это функции, которые принимают входные данные (например, строку или объект) и возвращают их изменённый вариант. Django позволяет создавать собственные фильтры, чтобы решать специфические задачи.

Мы рассмотрим пример фильтра, который принимает текст, накладывает его на изображение и возвращает сгенерированное изображение.

Убедитесь, что у вас установлен Pillow — библиотека Python для работы с изображениями. Установите её, если ещё не сделали этого:

pip install pillow
 

Создайте файл templatetags/custom_filters.py в приложении, где вы хотите использовать фильтр:

Добавьте следующий код в custom_filters.py:

from django import template
from PIL import Image, ImageDraw, ImageFont
import io
import base64

register = template.Library()

@register.filter
def generate_image_with_text(text):
    """Генерирует изображение с текстом."""
    # Настройки изображения
    width, height = 400, 200
    background_color = (255, 255, 255)  # белый фон
    text_color = (0, 0, 0)  # чёрный текст
    font_size = 20

    # Создание изображения
    image = Image.new('RGB', (width, height), background_color)
    draw = ImageDraw.Draw(image)

    # Загрузка шрифта
    try:
        font = ImageFont.truetype("arial.ttf", font_size)
    except IOError:
        font = ImageFont.load_default()

    # Расположение текста
    text_width, text_height = draw.textsize(text, font=font)
    text_x = (width - text_width) // 2
    text_y = (height - text_height) // 2

    draw.text((text_x, text_y), text, fill=text_color, font=font)

    # Сохранение изображения в буфер
    buffer = io.BytesIO()
    image.save(buffer, format="PNG")
    buffer.seek(0)

    # Кодирование изображения в base64
    img_base64 = base64.b64encode(buffer.getvalue()).decode()
    return f"data:image/png;base64,{img_base64}"

Подключите фильтр в шаблоне, где хотите его использовать:

{% load custom_filters %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Генерация изображения</title>
</head>
<body>
    <h1>Пример генерации изображения</h1>
    <img src="{{ 'Привет, Django!'|generate_image_with_text }}" alt="Сгенерированное изображение">
</body>
</html>

 

 

 
 

Автор:

42

Читайте также

0 комментариев