Как временно сохранить сгенерированный образ для загрузки

#django #image #download #temporary

#django #изображение #Скачать #временный

Вопрос:

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

Мой текущий код:

 def Output(request):
    inputValue = request.GET.get('t', '')
    my_image = Image.open(os.path.join(BASE_DIR, 'media', 'blank.jpg'))
    title_font = ImageFont.truetype(os.path.join(BASE_DIR, 'homepage', 'static', 'homepage', 'Mistral.ttf'), 60)
    title_text = inputValue
    image_editable = ImageDraw.Draw(my_image)
    image_editable.text((45,333), title_text, (0, 0, 0), font=title_font)
    my_image.save(os.path.join(BASE_DIR, 'media', 'result.jpg'))
    return TemplateResponse(request, 'homepage/output.html', {'title': 'Output'})
 

поэтому вместо того, чтобы ОС сохраняла изображение локально как result.jpg , как мне сохранить его временно для определенного сеанса?

Ответ №1:

Вы можете использовать base64 концепцию, преобразовать свой result.jpg in base64 и передать строку base64 через context

 import base64
from io import BytesIO
from PIL import Image

def get_base64(image):
    buffered = BytesIO()
    image.save(buffered, format="JPEG")
    img_str = base64.b64encode(buffered.getvalue())
    return "data:image/jpeg;base64,"   img_str.decode()


def Output(request):
    inputValue = request.GET.get('t', '')
    my_image = Image.open(os.path.join(BASE_DIR, 'media', 'blank.jpg'))
    title_font = ImageFont.truetype(os.path.join(BASE_DIR, 'homepage', 'static', 'homepage', 'Mistral.ttf'), 60)
    title_text = inputValue
    image_editable = ImageDraw.Draw(my_image)
    image_editable.text((45,333), title_text, (0, 0, 0), font=title_font)
    base_image = get_base64(image_editable)
    return TemplateResponse(request, 'homepage/output.html', {'base_image': base_image})
 

В HTML-файле

 <img src="{{base_image}}"/> 
 

Таким образом, вам не нужно сохранять изображение в системе, а изображение base64 будет легко работать с тегом HTML image

Комментарии:

1. Я получаю сообщение об ошибке «Объект ImageDraw» не имеет атрибута «сохранить»

Ответ №2:

Я заставил его работать, изменив то, что написал Нирадж Кумар

 import os
from django.shortcuts import render
from django.template.response import TemplateResponse
from PIL import Image, ImageFont, ImageDraw
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
from io import BytesIO
import base64

def get_base64(image):
    img = Image.open(image)
    buffered = BytesIO()
    img.save(buffered, format="PNG")
    img_str = base64.b64encode(buffered.getvalue())
    return img_str.decode()

def Output(request):
    inputValue = request.GET.get('t', '')
    my_image = Image.open(os.path.join(BASE_DIR, 'media', 'blank.png'))
    title_font = ImageFont.truetype(os.path.join(BASE_DIR, 'homepage', 'static', 'homepage', 'Mistral.ttf'), 60)
    title_text = inputValue
    image_editable = ImageDraw.Draw(my_image)
    image_editable.text((45,333), title_text, (0, 0, 0), font=title_font)
    my_image.save(os.path.join(BASE_DIR, 'media', 'result.png'))
    base_image = "data:image/png;base64,"   get_base64(os.path.join(BASE_DIR, 'media', 'result.png'))
    return TemplateResponse(request, 'homepage/output.html', {'title': 'Output', 'base_image': base_image})