如何在 django 中返回在枕头中生成的图像而不保存在数据库中?

Posted

技术标签:

【中文标题】如何在 django 中返回在枕头中生成的图像而不保存在数据库中?【英文标题】:How can I return an image generated in pillow in django without saving in db? 【发布时间】:2021-09-21 06:21:48 【问题描述】:
    def build_image(image_data):
        template = Image.open("path/to/file/template.jpg")
        draw = ImageDraw.Draw(template)
        draw.text("(553,431)", f"image_data.text", fill=4324234, font=font)
        file = InMemoryUploadedFile(template, None, 'result.jpg', 'image/jpeg', template.tell, None)
        return FileResponse(file, as_attachment=True, filename='result.jpg')

我需要返回修改后的图像,而不是将其保存到数据库中。上面的代码给出了以下错误:

A server error occurred.  Please contact the administrator.
    我还尝试了以下选项:
rea_response = HttpResponse(template, content_type='image/png')
        rea_response['Content-Disposition'] = 'attachment; filename='.format('result.png')
        return rea_response

但在这种情况下,我得到了一个损坏的文件。 (不支持这种格式)。

django==3.0.6

【问题讨论】:

你能翻译一下标题吗?这里不是每个人都懂俄语。 @EJoshuaS-ReinstateMonica,完成 【参考方案1】:

如果您想返回(图像的)原始字节,则将文件处理程序传递给 Image.save(),如 here 所述。

例如

import io

def foo():
    template = Image.open("path/to/file/template.jpg")
    draw = ImageDraw.Draw(template)
    draw.text("(553,431)", f"image_data.text", fill=4324234, font=font)
    buff = io.BytesIO()
    template.save(buff, format='JPEG')
    return buff

【讨论】:

这一切都发生在视图中。用户点击按钮,通过更改模板开始下载在pillow中生成的jpg格式的文件。如果我按照您的回答进行操作,并将 buff 传递给FileResponse(buff, as_attachment=True, filename='result.jpg'),我将承受无穷无尽的负担。 那为什么不将图像保存到临时静态文件并提供此链接以供下载?见django docs on static files 和this topic on SO

以上是关于如何在 django 中返回在枕头中生成的图像而不保存在数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不将单独的帧图像写入磁盘的情况下从 C++ 程序中生成的多个图像编码视频?

Pillow 返回错误:“IOError:图像文件被截断(6 个字节未处理)”

在视图而不是模板中生成带有 Django 静态 url 的图像标签

如何在python中生成文件而不将其保存到磁盘?

如何将键盘导航焦点传递给 WPF 中生成的 xaml?以及如何退货?

如何在 scala 中生成的键值对中添加值