关于python:如何在模板中显示PIL图像对象?

How do I display a PIL Image object in a template?

如果用户上传了一个图像,我使用pil调整了它的大小,我会得到一个pil图像对象。

在保存到数据库之前,如何在模板中显示PIL Image文件?它甚至可以作为图像传入并呈现吗?


是和不是。

是的,您可以将图像作为原始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文件返回,然后在页面上的imghref属性中引用该视图。


对于一组有限的浏览器,您可以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.

好。。。当您使用时,foo总是由get来检索,也许这就是它不工作的原因——request.files在get请求中不可用。如果打开Firebug或Chrome调试工具栏,在"网络"选项卡中,您将看到带有上载图像的POST请求,然后会看到获取图像的GET请求。

您必须在两个步骤之间的某个位置保存图像。

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 + ' />

查看示例输出。