如何在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,并添加某种缓存机制,但我的理解是不会影响解决方案的这一部分。
答案 0 :(得分:29)
我假设你正在使用PIL(Python Imaging Library)。您需要替换最后一行(例如,如果您想要提供PNG图像):
response = HttpResponse(mimetype="image/png")
img.save(response, "PNG")
return response
有关详细信息,请参阅here。
答案 1 :(得分:3)
我自己对Django比较陌生。我在Django本身找不到任何东西,但我偶然发现了一个关于Google Code的项目,可能对你有所帮助:
答案 2 :(得分:1)
我一直在寻找解决同一问题的方法
对我来说,这种简单的方法效果很好:
from django.http import FileResponse
def dyn_view(request):
response = FileResponse(open("image.png","rb"))
return response
答案 3 :(得分:0)
另一种方法是使用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')