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

13 浏览
0 Comments

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

如果用户上传了一张图片,并且我使用PIL进行调整大小,我会得到一个PIL图像对象。\n在将其保存到数据库之前,我如何在模板中显示一个PIL图像文件?它能作为图像传递并渲染吗?

0
0 Comments

问题出现的原因是需要在模板中显示一个PIL图像对象。解决方法是将PIL图像对象转换为base64编码的字符串,并将其嵌入到标签中显示。

首先,需要导入PIL库的Image模块和StringIO模块。然后,创建一个新的PIL图像对象,并指定其大小为400x400像素。接下来,创建一个StringIO对象,用于保存图像的输出。使用save()方法将图像保存为PNG格式,并将输出保存到StringIO对象中。然后,将StringIO对象中的内容转换为base64编码的字符串。最后,关闭StringIO对象,并将base64字符串转换为列表,并取第一个元素作为最终的base64字符串。

在模板中显示图像的方法是使用标签,并将src属性设置为"data:image/png;base64,"加上刚刚生成的base64字符串。注意,需要将base64字符串放在引号中。这样,浏览器将会解析这个字符串,并将其作为图像显示出来。

通过参考提供的示例输出,可以查看最终的效果。需要注意的是,在示例输出中,需要将base64字符串的引号添加或修改为正确的方式。

最后,需要注意的是,有一个额外的步骤是在生成的base64字符串中删除换行符。这是因为base64编码的字符串中可能会包含换行符,而这会导致图像无法正确显示。因此,需要使用split()方法将字符串拆分为列表,并取列表中的第一个元素作为最终的base64字符串。

以上是将PIL图像对象显示在模板中的方法。通过将PIL图像对象转换为base64编码的字符串,并嵌入到标签中,可以在模板中正确地显示图像。

0
0 Comments

问题原因:在模板中显示一个PIL图像对象的问题。有人尝试将图像以原始Base64数据的形式放置在模板中,但是这种方法会导致HTML页面非常大,特别是在有多个缩略图的情况下,HTML页面可能会超过10MB。

解决方法:应该使用一个独立的Django视图将PIL对象作为PNG文件返回,并在页面的标签的href属性中引用该视图。以下是一个示例代码:

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))

以上代码将图像以Base64编码的形式嵌入到HTML页面中。但是,这种方法不推荐使用,因为会导致HTML页面非常大。更好的做法是创建一个Django视图来返回PIL对象的PNG文件,并在页面中使用该视图的URL作为标签的href属性。

0
0 Comments

问题的出现原因:

用户想要在模板中展示一个PIL Image对象,但是使用标签时,foo总是通过GET请求获取,而在GET请求中无法使用request.FILES。因此,需要一种解决方法。

解决方法:

1. 对于一部分浏览器,可以将图片进行base64编码,然后使用内联图片。具体方法可以参考Embedding Base64 Images

2. 一种适用于所有浏览器的解决方法是,使用一个引用了返回图片的view的图片标签。具体可参考这里的示例代码。

补充:

用户希望用户能够提交原始图片,并在另一个表单中输入图片的标题(标题字段左侧显示调整大小后的图片)。然后,当用户点击“提交”按钮时,图片和标题会保存在一个模型实例中。但是,使用标签时,foo总是通过GET请求获取,而在GET请求中无法使用request.FILES。因此,需要一种解决方法。

解决方法:

用户需要将图片在两个步骤之间保存起来,常见的选择是使用redismemcached,也可以将图片数据保存在会话变量中。

用户还问到了如何在图片标签中引用一个view的问题,具体的引用方法是:the same url from urls.py, got it?

最后,用户表示感谢之前的帮助,并表示在模板中的图片标签中无法正常工作,可能是因为没有传递某个参数。

0