我目前正在從 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()
uj5u.com熱心網友回復:
一些觀察:
- 寫入檔案的代碼
conn.recv()在while回圈內執行,一次最多接收 8kB,并將每次接收到的內容附加到檔案中。您的代碼不起作用,無法累積任何內容,它只是嘗試將每次獲得的任何內容解釋為影像。所以你需要把你收到的東西累積成更大的東西,然后在回圈結束后打開它 - 你可以通過除錯來幫助自己,所以列印你在每次迭代中收到的資料的長度,即
len(data) - 如果您希望收到 PIL 可以打開的內容,請列印前 20 個位元組左右,即
data[:20],并檢查它是否以與磁盤上另一個普通 PNG 檔案相同的簽名(幻數)開頭 - 使用xxd或如果您不使用有那個,試試這里。PNG 簽名89 50 4e 47 0d 0a 1a 0a見此處。
uj5u.com熱心網友回復:
在接收端(您的客戶端?),您從套接字接收位元組。我想你可以使用 Image.frombytes 直接從它創建一個影像并顯示它。或者,將您從套接字獲得的位元組寫入一個新檔案(確保以“wb”二進制模式打開它)和 Image.open() 該檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/370729.html
