无需保存即可渲染图像

时间:2014-06-14 11:28:41

标签: python django

我想从用户那里获取图像,在beckend处理它并将结果呈现给用户。是否可以不在磁盘上保存图像?

我的观点:

class InputImageForm(forms.Form):
    image = forms.ImageField()


def get_image(request):
    if request.method == 'POST':
        form = InputImageForm(request.POST, request.FILES)
        if form.is_valid():
            image = request.FILES['image']
            #some actions with image
            return render_to_response('results.html', {'image': image})
        else:
           form = InputImageForm()
    else:
        raise Http404

在模板中,标记{{image}}返回文件名。

3 个答案:

答案 0 :(得分:3)

如果您的表单是模型表单,那么请尝试以下代码。

from django.core.files import File
from django.core.files.temp import NamedTemporaryFile

class InputImageForm(forms.Form):
    image = forms.ImageField()
    class Meta:
       model = YourModel



def get_image(request):
    if request.method == 'POST':
        form = InputImageForm(request.POST, request.FILES)
        if form.is_valid():
            image = request.FILES['image']
            save_image_from_url(form,image)

        else:
           form = InputImageForm()
    else:
        raise Http404



def save_image_from_url(model, img):
    r = request.FILES['image']

    img_temp = NamedTemporaryFile(delete=True)
    img_temp.write(r.content)
    img_temp.flush()

    i = model.image.save("image.jpg", File(img_temp), save=True)
    return HttpResponse(i.read(), mimetype="YOUR MIME TYPE")

答案 1 :(得分:2)

问题是将页面返回给用户通常会涉及两个请求:一个用于HTML页面,另一个用于图像本身,由该HTML中的img标记引用。但正如你所说,在此期间不将其存储在任何地方,图像就会丢失。

还有另一种方法:您可以使用data uri在html中包含内嵌图像的实际数据。这意味着您不必在请求中保留它,因为所有内容都将在一个请求中返回。大多数浏览器都支持数据uris,包括ie8 +。

您可以像这样格式化数据,例如:

from base64 import b64encode

encoded = b64encode(img_data)
mime = "image/jpeg"
uri = "data:%s;base64,%s" % (mime, encoded)

直接在模板中使用它:

<img src="{{ uri }}">

答案 2 :(得分:1)

这个答案的灵感来自@Daniel Roseman 的答案

将图像写入 BytesIO()

from PIL import Image  
img = Image.open("image.jpg") 
data = io.BytesIO()
img.save(data, "JPEG") # just an example, load the image into BytesIO any way you like.

img 编码为 base64

encoded_img = base64.b64encode(data.getvalue())

在上下文中解码 img,以及设置 content_type

decoded_img = encoded_img.decode('utf-8')
img_data = f"data:image/jpeg;base64,{decoded_img}"

渲染你的模板

return render(request, "index.html", img_data=img_data)

在您的 HTML 模板中

<img src="{{ img_data }}" >

你也可以查看https://buraksenol.medium.com/pass-images-to-html-without-saving-them-as-files-using-python-flask-b055f29908a