首先,我的情况描述如下:
我正在开发一个Django应用程序演示。该演示可以从用户接收图像文件。然后我的Django应用程序将处理此图像,例如添加一些文本或更改图像大小。
我是Django的新手,文件流和响应。我尝试做一些搜索和研究。但我找不到合适的案例。也许我没有用准确和恰当的关键词描述我的问题。
我不想先将处理过的图像保存到本地磁盘,然后将文件的本地路径恢复到Django web。我想将图像直接返回到内存中的浏览器。
顺便说一句,django似乎不建议直接在本地磁盘上读取媒体文件。 css和js都需要配置static_path才能正常工作。另外,根据我的调查,似乎直接在内存中处理和返回文件是一种更主流的做法。当然,我刚接触过这个领域。情况可能并非如此。我只想介绍一些想法来帮助描述这个棘手的问题。
我的错误是:现在我的django应用程序可以获得用户的图像并顺利处理它。我还找到了一种很酷的方法将'PIL Image对象'转换为'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="<HttpResponse status_code=200, "image/png">">
SECOND way: html source in Chrome dev tools
我感到兴奋!但我无法显示图像。我很难过。
如何将BytesIO类型的图像数据转换为url并在html页面中显示? Expected effect
答案 0 :(得分:1)
为什么不直接在专用URL上提供二维图像数据,而不是尝试使用模板渲染二进制图像数据?您需要将呈现模板的视图与提供图像数据的视图分开。
对于提供图像数据的视图,它可以返回HttpResponse
:
def get_image(request):
...
image_data = byte_file.getvalue()
return HttpResponse(image_data, content_type="image/png")
您需要在urls.py
:
url(r'^get_image', get_image)
然后在您的模板中,图片的src
属性应指向get_image
网址。
<div>
<img src="/get_image" />
</div>