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

问题描述 投票:0回答:4

如何在 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,并添加某种缓存机制,但我的理解是这不会影响解决方案的这一部分。

python ajax django image
4个回答
31
投票

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

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

请参阅此处了解更多信息。


3
投票

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

django-动态媒体-服务


3
投票

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

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

from django.http import FileResponse

def dyn_view(request):

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

1
投票

另一种方法是使用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')
© www.soinside.com 2019 - 2024. All rights reserved.