如何在模板中显示PIL图像对象?

sga*_*a62 17 python django image django-templates python-imaging-library

如果用户上传图像,并使用PIL调整大小,我会得到一个PIL Image对象.

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

Fre*_*nan 15

是的,不是.

是的,您可以将图像作为原始Base64数据.这是一个可以用来测试这个的小脚本:

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))
Run Code Online (Sandbox Code Playgroud)

但是,这是一个非常糟糕的主意.使用多个缩略图,您的单个HTML页面可能是10MB +.

您真正应该做的是使用单独的Django视图将PIL对象中的图像作为PNG文件返回,然后在img href页面的属性中引用该视图.


Pau*_*ine 13

对于一组有限的浏览器,您可以对图像进行base64编码并使用内嵌图像.请参阅嵌入Base64图像.

适用于所有浏览器的解决方案是引用返回图像视图的图像标记.

[更新]

我想要的只是让用户提交原始图像,然后由另一个表单提示输入图像的标题(调整后的图像位于标题字段的左侧).然后,当用户点击"提交"图像时,标题将保存在模型实例中.

嗯...当你使用时<img src="foo">,foo总是被GET检索,这也就是它无法工作的原因 - request.FILES将无法在GET请求中使用.如果您打开firebug或chrome调试工具栏,则在网络选项卡中,您将看到带有上载图像的POST请求,然后是GET请求以获取图像.

您必须在两个步骤之间的某处保存图像.

我怎么能保存它?我希望它是暂时的.你认为有一种非常简单的方法可以做到这一点,还是应该去研究这些选择?

流行的选择是redismemcached.您可以将它们视为具有过期日期的巨型共享python dict.如果图像很小,如头像,您还可以将图像数据保存在会话变量中.

  • `&lt;img src="/url/to/my/image-returning/view/perhaps/with/1/or/2/parameters/" alt="与 urls.py 相同的 url,明白了吗?"&gt;` (2认同)

Ahm*_*GÜN 6

您可以将base64编码图像嵌入到标记中.因此,您可以将PIL图像转换为base64,然后显示它.

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('\n')[0]
Run Code Online (Sandbox Code Playgroud)

然后显示:

 <img src="data:image/png;base64,' + contents + ' />
Run Code Online (Sandbox Code Playgroud)

查看示例输出.