当前位置: 首页 > 知识库问答 >
问题:

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

米迪
2023-03-14
  1. 生成图像
  2. 用scipy.misc.toImage将图像保存到磁盘
  3. 从磁盘打开保存的图像文件
  4. 使用请求模块发送包含image opened image file对象的http请求

这非常好,但是我想摆脱步骤2和3,所以我不需要先将对象保存到磁盘,然后再加载它。相反,我希望在一个与http服务器兼容的文件对象中转换我的numpy数组,并直接发送它。(就像从open()中得到的一样)

例如,我知道用PIL将numpy数组转换为PNG-image很容易,但我只找到了如何在一个函数中结合保存到磁盘来实现这一点。

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)

我想要这个:

arr = generate64x64x3ImageWithNumpy()

not_on_disk = numpyArrayToPNGImageWithoutSavingOnDisk(arr)

d = {'key':API_KEY}
f = {'image': not_on_disk}
result = requests.post(SERVER_URL, files=f, data=d)

共有1个答案

闻安宜
2023-03-14

您可以在内存中使用带有savefig的iostream(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关键字用于保存。

 类似资料:
  • 我有一个方法,在. txt或. docx文件的代码的不同部分接收来自的。我想创建一个新的对象,从以后读取内容的字节,而不保存该文件到磁盘。这有可能吗?或者有更好的方法从文件字节中获取内容?

  • 我正在Windows服务器上使用C#处理存储在IIS服务器上的web应用程序。 null

  • 问题内容: 有没有一种好方法可以在不使用磁盘的情况下在两个python子进程之间传递大量数据?这是我希望完成的动画片示例: 这将创建一个子进程,该子进程生成一个numpy数组并将该数组保存到磁盘。然后,父进程从磁盘加载阵列。有用! 问题是,我们的硬件生成数据的速度比磁盘读写速度快10倍。有没有一种方法可以将数据从一个python进程传输到另一个纯粹的内存中,甚至可能不复制数据?我可以做类似参考传递

  • 注意:我更喜欢使用。NET framework库(而不是外部库)来完成此操作

  • 下面的代码在内存中创建了一个文件。 我想把那个pdf文件保存在磁盘上以便查看。我将如何在python中实现它?

  • 可引导的软盘一般被视为是最后一种方法用于在那些不能从光盘引导安装程序的硬件上引导安装程序, 也适用于其他类似的情况。 磁盘映像是一些装有原始的软盘文件内容的文件。 磁盘映像,比如 boot.img 则不能直接拷贝到软盘中。 一个特殊的程序负责向软盘中 安装原始模式写入磁盘映像文件 raw 。这是一个必须的步骤,因为这些映像 文件是一些原始的磁盘保存方式。所以需要把文件的数据 按扇区拷贝 放到软盘