【问题标题】:how to output a Image in Django web page with PIL Image如何使用 PIL Image 在 Django 网页中输出图像
【发布时间】: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


    【解决方案1】:

    您可以将 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 + ' />')
    

    【讨论】:

      【解决方案2】:

      你有两个选择:

      1. 将您的图片保存在您的网络服务器可以提供的位置
      2. base64编码直接显示

      第一个选项是首选选项。代码应该是这样的:

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

      【讨论】:

        【解决方案3】:

        还有第三种方法可以实现这一点,即让视图返回原始图像,以便可以在图像标签的 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。

        【讨论】:

          猜你喜欢
          • 2020-09-16
          • 2016-10-21
          • 1970-01-01
          • 1970-01-01
          • 2020-04-19
          • 2011-04-13
          • 1970-01-01
          • 2015-09-27
          • 1970-01-01
          相关资源
          最近更新 更多