读取字节并将其显示为 Python 中的图像

Reading and displaying bytes to image in 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()

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

几点观察:

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