如何在Python中显示';是否表示为字节数组而不将其写入文件?

如何在Python中显示';是否表示为字节数组而不将其写入文件?,python,matplotlib,temporary-files,Python,Matplotlib,Temporary Files,我已经成功地通过套接字发送了一个图像,在接收端,我拥有与发送的图像文件完全相同的原始字节。这意味着,如果我将这些字节二进制写入一个文件,我将获得与发送的文件相同的文件。我曾经尝试过在不保存的情况下显示Python中的图像,但是在这样做时遇到了问题。如果我理解正确,matplotlib.imread()需要文件的路径,然后将该文件解码为多个矩阵。这样做很好: import matplotlib.pyplot as plt import matplotlib.image as mpimg # da

我已经成功地通过套接字发送了一个图像,在接收端,我拥有与发送的图像文件完全相同的原始字节。这意味着,如果我将这些字节二进制写入一个文件,我将获得与发送的文件相同的文件。我曾经尝试过在不保存的情况下显示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
,就像使用常规文件一样。阅读时请记住设置编解码器:

导入matplotlib.pyplot作为plt
将matplotlib.image导入为mpimg
#不要从套接字读取数据,而是在您将调用read的地方调用此函数
fp=您的_socket.makefile()
对于fp:
img=mpimg.imread(fp,format='jpeg')
plt.imshow(img)
plt.show()
我已经搜索过了,但找不到直接从matplotlib中的字节解码图像的方法。如果由于您已经有字节数组而无法使用上述解决方案,则使用
BytesIO
创建临时缓冲区:

导入matplotlib.pyplot作为plt
将matplotlib.image导入为mpimg
输入io
fp=io.BytesIO(数据)
对于fp:
img=mpimg.imread(fp,format='jpeg')
plt.imshow(img)
plt.show()

第一个解决方案应该可以工作,但它与我尝试使用此应用程序所做的工作不太相符。从客户端,我请求几个图像,然后保存这些图像,或者首先需要查看它们并保存(如果需要)。我不知道是否可以将您的解决方案用于多个图像。我目前正在尝试第二个解决方案。我在第二个解决方案的imread上遇到一个异常:py3.8\lib\site packages\PIL\PngImagePlugin.py”,第639行,在“open raise SyntaxError(“非PNG文件”)文件中”“,line None SyntaxError:不是PNG文件我使用了第二种解决方案,使用枕头代替matplotlib,效果很好!事实证明matplotlib.image.imread()不能将BytesIO对象作为参数,但以下代码对我有效:从PIL导入图像img=image.open(io.BytesIO(data))img.show()必须在imread中指定编解码器,否则它将采用PNG格式,这就是您遇到的错误。如果使用jpeg,请尝试
mpimg.imread(fp,format=“jpeg”)
。或者您用于通过套接字对图像进行编码的文件格式。。。