【问题标题】:In the django web project, how to translate BytesIO object to image url? How to convert the file stream(image) to the original image file? [duplicate]在 django web 项目中,如何将 BytesIO 对象转换为图像 url?如何将文件流(图像)转换为原始图像文件? [复制]
【发布时间】:2018-03-25 07:16:36
【问题描述】:

首先,我的情况描述如下:

我正在开发一个 Django 应用演示。该演示可以接收来自用户的图像文件。然后我的 Django 应用程序将处理此图像,例如添加一些文本或更改图像大小。

我是 Django 的新手,文件流和响应。我尝试做一些搜索和研究。但我找不到合适的案例。也许我没有用准确和恰当的关键词来描述我的问题。

我不想先把处理后的图片保存到本地磁盘,然后再把文件的本地路径取回Django web。我想在内存中直接将图片返回给浏览器。

顺便说一句,django 似乎不建议直接读取本地磁盘上的媒体文件。 css 和 js 都需要配置 static_path 才能正常工作。另外,根据我的调查,似乎直接在内存中处理和返回文件是一种比较主流的做法。当然,我也是刚刚接触到这个领域。情况可能并非如此。我只是想介绍一些想法来帮助描述这个棘手的问题。

我的错误是这样的:现在我的 django 应用程序可以获取用户的图像并顺利处理它。我还找到了一种将“PIL 图像对象”转换为“BytesIO 对象”的好方法。感谢 Stackoverflow。我在 Stackoverflow 上找到了有关 BytesIO 的方法。

下一步是,我想返回这个处理后的图像。现在,图像的最后状态是“BytesIO 对象”。

如下代码:

# Python CODE

# above is processing with PIL
# the image is the Image object

image = Image.composite(image, bg, image)


# below is my new code
# I wrote the on the head: import Bytes IO

byte_file = BytesIO()
image.save(byte_file, format='PNG')
image_data = byte_file.getvalue()
return image_data

而html演示是:

<!-- HTML CODE -->    
<div>
    <img src='{{ image_data }}' />
</div>

我在浏览器中看到的结果是:

<!-- Chrome developer tools watch the source code -->  
<img src="b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\ ... ... />

我知道只剩下一小步了,我将能够显示图像。但是,我就是找不到正确的方法。昨晚郁闷了,估计几行代码就搞定了。但是,因为不熟悉文件流程,我陷入了困境。

我尝试第二种方式:

# Python CODe
image_data = byte_file.getvalue()
return HttpResponse(image_data,content_type="image/png")

html源码为:

<img src="&lt;HttpResponse status_code=200, &quot;image/png&quot;&gt;">

SECOND way: html source in Chrome dev tools

我感到很兴奋!但我无法显示图像。我很难过。

如何将 BytesIO 类型的图片数据转换为 url 并在 html 页面中显示? Expected effect

【问题讨论】:

    标签: python django


    【解决方案1】:

    与其尝试使用模板呈现二进制图像数据,不如直接在专用 URL 上提供它?您需要将呈现模板的视图和提供图像数据的视图分开。

    对于传递图像数据的视图,它可以返回一个HttpResponse

    def get_image(request):
        ...
        image_data = byte_file.getvalue()
        return HttpResponse(image_data, content_type="image/png")
    

    您需要在 urls.py 中的适当 URL 上公开该视图:

    url(r'^get_image', get_image)
    

    然后在您的模板中,图像的src 属性应指向get_image URL。

    <div>
      <img src="/get_image" />
    </div>
    

    【讨论】:

      猜你喜欢
      • 2019-08-05
      • 2016-02-14
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2014-07-17
      • 1970-01-01
      相关资源
      最近更新 更多