#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})