如何在不将图像写入文件的情况下显示 Python 中表示为字节数组的图像?

How can I display an image in Python that's represented as an array of bytes without writing it to a file?

我已经通过套接字成功发送了图像,并且在接收端,我拥有与发送的图像文件完全相同的原始字节。这意味着如果我将这些字节二进制写入一个文件,我将获得与发送的文件相同的文件。我曾尝试显示来自 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()

显然我应该为此使用一个临时文件,但我只是为了示例而写的。如果我已经有了这些字节,是否有任何方法可以在不事先调用 imread() 的情况下调用 imshow()show() 方法?

如果您可以直接从套接字读取,您可以使用 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 中的字节解码图像的方法。如果因为你已经有了bytes数组而无法使用上面的解决方案,那么使用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()