如何在Python中显示以字节数组表示的图像而不将其写入文件?

问题描述

我已经成功地通过套接字发送了一个图像,并且在接收端,我拥有与发送的图像文件完全相同的原始字节。这意味着,如果我将这些字节二进制写入文件,则将获得与发送文件相同的文件。我尝试不先保存就显示来自Python的图像,但是这样做很麻烦。如果我理解正确,matplotlib.imread()要求提供文件路径,然后将该文件解码为多个矩阵。做这样的事情很好:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

# data is the image data that was received from the socket

file = open("d:\\image.png",'wb')
file.write(data)
file.close()

img = mpimg.imread("d:\\image.png")
plt.imshow(img)
plt.show()

很显然,我应该为此使用一个临时文件,但是我只是出于示例的目的编写了该文件。

如果我已经有这些字节,是否可以在不事先调用imshow()的情况下调用show()imread()方法?

解决方法

如果可以直接从套接字读取,则可以使用makefile()将套接字转换为文件对象,然后像使用常规文件一样将套接字提供给imread。记住在阅读时设置编解码器:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

# don't read from your socket,instead,call this where you would call read
fp = your_socket.makefile()

with fp:
    img = mpimg.imread(fp,format='jpeg')
plt.imshow(img)
plt.show()

我已经搜索过,但是找不到直接从matplotlib中的字节解码图像的方法。如果由于已经有字节数组而不能使用上述解决方案,请使用BytesIO创建一个临时缓冲区:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import io

fp = io.BytesIO(data)

with fp:
    img = mpimg.imread(fp,format='jpeg')
plt.imshow(img)
plt.show()

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...