如何临时存储生成的图像以供下载

问题描述

我已经编写了一些代码来拍摄图像,并向其中添加一些文本。目前它只是在本地保存文件,但我希望它临时存储新生成的图像,因此当会话关闭时,文件将被删除。此外,将来多个用户可以同时使用该功能,而无需一个用户编写另一个图像。

我当前的代码是:

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','Mistral.ttf'),60)
    title_text = inputValue
    image_editable = ImageDraw.Draw(my_image)
    image_editable.text((45,333),title_text,(0,0),font=title_font)
    my_image.save(os.path.join(BASE_DIR,'result.jpg'))
    return TemplateResponse(request,'homepage/output.html',{'title': 'Output'})

因此将图像本地保存为 result.jpg,我如何为特定会话临时保存它?

解决方法

您可以使用 base64 概念,在 result.jpg 中转换您的 base64 并通过 context 传递 base64 字符串

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','Mistral.ttf'),60)
    title_text = inputValue
    image_editable = ImageDraw.Draw(my_image)
    image_editable.text((45,333),title_text,(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图像标签上工作

,

我通过修改 Neeraj Kumar 所写的内容使其工作

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','blank.png'))
    title_font = ImageFont.truetype(os.path.join(BASE_DIR,font=title_font)
    my_image.save(os.path.join(BASE_DIR,'result.png'))
    base_image = "data:image/png;base64," + get_base64(os.path.join(BASE_DIR,'result.png'))
    return TemplateResponse(request,{'title': 'Output','base_image': base_image})