使用 Django 提供动态生成的图像

Posted

技术标签:

【中文标题】使用 Django 提供动态生成的图像【英文标题】:Serve a dynamically generated image with Django 【发布时间】:2010-11-07 15:13:48 【问题描述】:

如何在 Django 中提供动态生成的图像?

我有一个html标签

<html>
...
    <img src="images/dynamic_chart.png" />
...
</html>

链接到这个请求处理程序,它会创建一个内存中的图像

def chart(request):
    img = Image.new("RGB", (300,300), "#FFFFFF")
    data = [(i,randint(100,200)) for i in range(0,300,10)]
    draw = ImageDraw.Draw(img)
    draw.polygon(data, fill="#000000")
    # now what?
    return HttpResponse(output)

我还计划将请求更改为 AJAX,并添加某种缓存机制,但我的理解是这不会影响这部分解决方案。

【问题讨论】:

【参考方案1】:

我假设您使用的是 PIL(Python 图像库)。您需要将最后一行替换为(例如,如果您想提供 PNG 图像):

response = HttpResponse(mimetype="image/png")
img.save(response, "PNG")
return response

更多信息请参见here。

【讨论】:

我在这个例子中使用了 PIL,但可能会使用 matplotlib 等其他库。不过应该也可以。 如果您使用的是 Django 1.10 +,请使用 content_type 而不是 mime 类型 更新python3 from PILLOW import Image from io import BytesIO img = Image.open("some_image.jpg") img_byte_arr = BytesIO() img.save(img_byte_arr, format='PNG') return HttpResponse (img_byte_arr.getvalue(), "image/png")【参考方案2】:

我自己对 Django 比较陌生。我在 Django 本身中找不到任何东西,但我偶然发现了一个关于 Google Code 的项目,它可能对您有所帮助:

django-dynamic-media-serve

【讨论】:

好链接,当我进入缓存阶段时可能会有用【参考方案3】:

我正在寻找相同问题的解决方案

对我来说,这种简单的方法效果很好:

from django.http import FileResponse

def dyn_view(request):

    response = FileResponse(open("image.png","rb"))
    return response

【讨论】:

【参考方案4】:

另一种方法是使用 BytesIO。 BytesIO 就像一个缓冲区。因此可以将图像保存在该缓冲区中(这比写入磁盘要快)。

from PIL import Image, ImageDraw
import io

def chart(request):
    img = Image.new('RGB', (240, 240), color=(250,160,170))
    draw = ImageDraw.Draw(img)
    draw.text((20, 40), 'some_text')

    buff = io.BytesIO()
    img.save(buff, 'jpeg')
    return HttpResponse(buff.getvalue(), content_type='image/jpeg')

【讨论】:

以上是关于使用 Django 提供动态生成的图像的主要内容,如果未能解决你的问题,请参考以下文章

Django:在按钮按下时提供动态生成的数据作为附件

如何不在 Python、Django 中生成两次相同的动态图像?

django 动态生成PDF文件

Django - 如何从外部源动态显示图像

从 django 模板语言生成动态 HTML 表格

在 Python 中动态生成导入,专门针对 Django 模型