在Python中读取和显示要映像的字节



我当前正在从Python中的套接字接收帧,接收的图像类型为字节。然后将图像保存到一个目录中。如下:

from socket import *
import cv2
port = 9999
s = socket(AF_INET, SOCK_STREAM)
s.bind(('', port))
s.listen(1)
conn, addr = s.accept()
print("Connected by the ",addr)
with open('/home/Desktop/frame/my_image.png', 'wb') as file:
while True:
data = conn.recv(1024*8)
if not data: break
file.write(data)

conn.close() 

然而,实际上我想做的是,在保存和打开图像之前,我想直接将字节转换为图像并显示它,而不是从保存的目录中读取图像。

代码现在完全工作:

from socket import *
import datetime
import cv2
import PIL.Image as Image
from PIL import ImageFile, Image
import io
import base64
import numpy as np
import pickle
date_string = datetime.datetime.now().strftime("%Y-%m-%d-%H:%M")
port = 9999
s = socket(AF_INET, SOCK_STREAM)
s.bind(('', port))
s.listen(1)
conn, addr = s.accept()
img_dir = '/home/Desktop/frames_saved/'
img_format = '.png'
b=bytearray()
print("Connected by the ",addr)
with open(img_dir+date_string+img_format, 'wb') as file:
while True:
data = conn.recv(1024*1024*1)
if not data: break
file.write(data)
b += data
conn.close()
ImageFile.LOAD_TRUNCATED_IMAGES = True
image = Image.open(io.BytesIO(b))
image.show()

一些观察结果:

  • 写入文件的代码在while循环中执行conn.recv(),一次最多接收8kB,并将每次接收的内容附加到文件中。你的代码不起作用,没有积累任何东西,它只是试图将每次得到的东西解释为图像。所以你需要把你收到的东西积累成更大的东西,然后在循环结束后打开它
  • 您可以通过调试来帮助自己,因此打印每次迭代中收到的数据的长度,即len(data)
  • 如果您希望收到PIL可以打开的东西,请打印前20个字节左右,即data[:20],并检查它是否以与磁盘上另一个普通PNG文件相同的签名(幻数(开头-使用xxd,如果您没有,请在此处尝试。PNG签名是89 50 4e 47 0d 0a 1a 0a,请参见此处

在接收端(您的客户端?(,您从套接字接收字节。我想你可以使用Image.fromytes直接从中创建一个图像并显示出来。或者,将从套接字获得的字节写入一个新文件(确保使用"wb"二进制模式打开它(,并将该文件写入Image.open((。

最新更新