How do I display a PIL Image object in a template?
如果用户上传了一个图像,我使用pil调整了它的大小,我会得到一个pil图像对象。
在保存到数据库之前,如何在模板中显示
是和不是。
是的,您可以将图像作为原始base64数据。下面是一个小脚本,您可以使用它来测试:
1 2 3 4 5 6 7 8 9 10 | import Image import base64 import StringIO output = StringIO.StringIO() im = Image.open("test.png") # Your image here! im.save(output, format='PNG') output.seek(0) output_s = output.read() b64 = base64.b64encode(output_s) open("test.html","w+").write('<img src="data:image/png;base64,{0}"/>'.format(b64)) |
然而,这真是一个坏主意。使用多个缩略图,您的单个HTML页面可能为10MB+。
您真正应该做的是使用单独的django视图将pil对象的图像作为png文件返回,然后在页面上的
对于一组有限的浏览器,您可以base64编码图像并使用内联图像。请参见嵌入base64图像。
适用于所有浏览器的解决方案是引用返回图像的视图的图像标记。
[更新]
All I want is for the user to submit the original image, and then be prompted by another form to input a caption for the image (with the resized image to the left of the caption field). Then when the user hits"submit" the image and the caption get saved in a model instance.
好。。。当您使用
您必须在两个步骤之间的某个位置保存图像。
how else could i save it? I would love for it to be temporary. Do you think there's a really easy way to do this, or should I go look into those options?
最流行的选择是redis和memcached。您可以将它们视为具有到期日期的巨型共享python dict。如果图像很小,如虚拟人物,也可以将图像数据保存在会话变量中。
您可以将base64编码的图像嵌入到标记中。所以您可以将PIL图像转换为base64,然后显示它。
1 2 3 4 5 6 7 8 9 10 | from PIL import Image import StringIO x = Image.new('RGB',(400,400)) output = StringIO.StringIO() x.save(output,"PNG") contents = output.getvalue().encode("base64") output.close() contents = contents.split(' ')[0] |
然后显示:
1 | <img src="data:image/png;base64,' + contents + ' /> |
查看示例输出。