【发布时间】:2012-09-11 18:04:38
【问题描述】:
我使用 Image.new 在 django 视图中创建一个图像对象, 我想在网页中展示它。
x = Image.new('RGB',(400,400)) 返回 HttpResponse(x.show(), mimetype="image/png")
没用。
如何将图像对象转换为图像原始二进制文件?
【问题讨论】:
标签: python django python-imaging-library
我使用 Image.new 在 django 视图中创建一个图像对象, 我想在网页中展示它。
x = Image.new('RGB',(400,400)) 返回 HttpResponse(x.show(), mimetype="image/png")
没用。
如何将图像对象转换为图像原始二进制文件?
【问题讨论】:
标签: python django python-imaging-library
您可以将 base64 图像嵌入到 <img src=,以便尝试将 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()
return HttpResponse('<img src="data:image/png;base64,' + contents + ' />')
【讨论】:
你有两个选择:
第一个选项是首选选项。代码应该是这样的:
x = Image.new() # The same stuff than yours
x.save(MEDIA_ROOT + "/generated_images/the_name_of_the_image.jpg", "JPEG")
return HttpResponse(
"<img src="%s/%s />" % (MEDIA_URL, "/generated_images/the_name_of_the_image.jpg")
)
如果你愿意,你可以在 base64 中阅读(见:Encoding an image file with base64) 并显示它:
base64_img = get_base_64()
return HttpResponse('<img alt="Embedded Image" src="data:image/jpeg;base64," % base64_img />')
【讨论】:
还有第三种方法可以实现这一点,即让视图返回原始图像,以便可以在图像标签的 src 属性中引用视图的 url。
在其他人使用的示例的基础上,返回动态生成图像的视图如下所示:
from PIL import Image
import StringIO
def dynamic_image(request):
image = Image.new('RGB', (400, 400))
output = StringIO.StringIO()
image.save(output, 'PNG')
contents = output.getvalue()
output.close()
return HttpResponse(contents, content_type='image/png')
urls.py 会将其引用为:
urlpatterns = [
path('image', views.dynamic_image, name="dynamic_image")
]
最后在HTML中,引用IMG标签中的视图:
<div>
<img src="{% url 'dynamic_image' %}" />
</div>
其他方法没有任何问题,但是当 Django 视图可以返回的不仅仅是 HTML 时,它们专注于返回 HTML。
【讨论】: