如果用户上传图片,并使用PIL调整大小,我会得到一个PIL Image object。如何在模板中显示PIL图像对象?
在将模板保存到数据库之前,如何在模板中显示PIL Image
文件?它甚至可以作为图像传递并呈现?
如果用户上传图片,并使用PIL调整大小,我会得到一个PIL Image object。如何在模板中显示PIL图像对象?
在将模板保存到数据库之前,如何在模板中显示PIL Image
文件?它甚至可以作为图像传递并呈现?
对于一套有限的浏览器,您可以对图像进行base64编码并使用内嵌图像。见Embedding Base64 Images。
适用于所有浏览器的解决方案是引用view that returns the image的图像标签。
[更新]
我要的是对用户提交的原始图像,然后通过另一种形式的输入被提示输入图像的标题(与调整后的图像来的左字幕字段)。然后,当用户点击“提交”图像和标题被保存在模型实例中。
嗯......当您使用<img src="foo">
,富总是由GET检索也许这就是为什么它不工作 - request.FILES将无法在GET请求可用。如果您打开萤火虫或Chrome调试工具栏,在网络标签中,您将看到带有上传图像的POST请求,并在此之后发出GET请求来获取图像。
您必须将图像保存在两个步骤之间的某处。
我还能保存吗?我会喜欢它是暂时的。你认为有这样一个非常简单的方法,或者我应该看看这些选项?
热门选择是redis和memcached。你可以把它们想象成巨大的共享python字典,并且过期日期。如果图像很小,就像化身一样,您也可以将图像数据保存到会话变量中。
您可以将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]
然后显示与:
<img src="data:image/png;base64,' + contents + ' />
查找到example output。
这工作后我删除了这行:contents = contents.split('\ n')[0] – Yerke
是的,没有。
是的,你可以把图像作为原始的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))
但是,这是一个非常糟糕的主意。使用多个缩略图,您的单个HTML页面可能为10MB +。
你真正应该做的是使用单独的Django视图将PIL对象中的图像作为PNG文件返回,然后在页面上的img
href
属性中引用该视图。
您确定要直接从您的Django进程提供图片吗?它不仅会占用宝贵的内存,它还会捆绑一个线程或进程 –
(没有任何确凿的证据)我认为保存图像并让前端Web服务器为您进行字节洗牌要好得多。看看X-Sendfile(Apache)或X-Accel-Redirect(Nginx)。 –