如何从python中的numpy数组创建png图像文件对象而不保存到磁盘(用于http请求)

时间:2018-11-16 14:03:33

标签: python numpy http request png

我需要使用http请求将PNG图像提交到黑盒服务器。我使用python3在numpy 64x64x3数组中生成图像。我目前正在做的是:

  1. 生成图像
  2. 使用scipy.misc.toimage将图像保存到磁盘
  3. 从磁盘打开保存的图像文件
  4. 使用请求模块发送带有打开的图像文件对象的http请求

这工作得很好,但是我想摆脱步骤2和3,因此不需要先将对象保存到磁盘然后再次加载它。相反,我想将我的numpy数组转换为与http服务器兼容的文件对象,然后直接发送它。 (就像您从open()获得的一样)

例如,我知道使用PIL从numpy数组转换为PNG图像很容易,但是我只找到了将其保存到一个函数中并结合使用的方法。

非常感谢您的帮助!

到目前为止,这是我的代码:

classify_images.py "images/*"

我想要这个:

import numpy as np
import requests
from scipy.misc import toimage

arr = generate64x64x3ImageWithNumpy()
toimage(arr, cmin=0.0, cmax=255.0).save('tmp.png')
d = {'key':API_KEY}
f= {'image': open('tmp.png', 'rb')}
result = requests.post(SERVER_URL, files=f, data=d)

1 个答案:

答案 0 :(得分:1)

您可以将带内存的iostream与savefig(https://docs.python.org/3/library/io.html#io.BytesIO)一起使用

import io
tmpFile = io.BytesIO()
savefig(tmpFile, format='png')

为验证可以将tmpFile正常工作与保存到磁盘的实际文件进行比较。

# Get contents of tmpFile
tmpFile.seek(0)
not_on_disk = tmpFile.read(-1)

# Save to and load from disk
fname = 'tmp.png'
savefig(fname)
on_disk = open(fname, 'rb').read(-1)

>>>not_on_disk == on_disk
True

编辑,您正在使用scipy和pil而不是matplotlib,但是答案应该是相同的,包括用于保存的format关键字。