2013-01-15 45 views
15

如果用户上传图片,并使用PIL调整大小,我会得到一个PIL Image object如何在模板中显示PIL图像对象?

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

+1

您确定要直接从您的Django进程提供图片吗?它不仅会占用宝贵的内存,它还会捆绑一个线程或进程 –

+1

(没有任何确凿的证据)我认为保存图像并让前端Web服务器为您进行字节洗牌要好得多。看看X-Sendfile(Apache)或X-Accel-Redirect(Nginx)。 –

回答

13

对于一套有限的浏览器,您可以对图像进行base64编码并使用内嵌图像。见Embedding Base64 Images

适用于所有浏览器的解决方案是引用view that returns the image的图像标签。

[更新]

我要的是对用户提交的原始图像,然后通过另一种形式的输入被提示输入图像的标题(与调整后的图像来的左字幕字段)。然后,当用户点击“提交”图像和标题被保存在模型实例中。

嗯......当您使用<img src="foo">,富总是由GET检索也许这就是为什么它不工作 - request.FILES将无法在GET请求可用。如果您打开萤火虫或Chrome调试工具栏,在网络标签中,您将看到带有上传图像的POST请求,并在此之后发出GET请求来获取图像。

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

我还能保存吗?我会喜欢它是暂时的。你认为有这样一个非常简单的方法,或者我应该看看这些选项?

热门选择是redismemcached。你可以把它们想象成巨大的共享python字典,并且过期日期。如果图像很小,就像化身一样,您也可以将图像数据保存到会话变量中。

+0

我将如何引用图片标签中的视图? – sgarza62

+1

'the same url from urls.py, got it?' –

+0

到目前为止,感谢您的帮助,我对延迟表示歉意......我一直试图让这个与我的代码一起工作。我能够将'Image'保存到'HttpResponse'对象(谢谢!),但是我无法从模板中的图像标记中使用它。也许我没有在URL中传递某个参数,我不确定。 – sgarza62

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] 

然后显示与:

<img src="data:image/png;base64,' + contents + ' /> 

查找到example output

+0

这工作后我删除了这行:contents = contents.split('\ n')[0] – Yerke

14

是的,没有。

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