我正在尝试通过套接字(以块为单位)将图像从“服务器”发送到“客户端”,但在客户端看不到该图像。
我正在使用枕头模块(特别是ImageGrab)。我正在抓取屏幕截图并将其另存为“ .png”文件,这样我便拥有了该文件所需的所有数据(所有这些都发生在服务器端)。
(我已经尝试将捕获的图像对象转换为字节而不将其保存到文件中,并且丢失了某些数据,例如'\ xPNG'统计信息,我想还有更多,我对照片的了解并不强文件)。
保存后,我用文件指针打开它,读取数据并通过套接字发送。
另一方面,我得到了一串字节(看起来像字节数据的字符串),并且我的计算机由于某种原因不知道如何读取。
一些常数:
MES_LEN_SPACE = 20
CHUNKS_LEN = 1024
END_CODE = "$$$$$"
服务器端:
这是我获取图像数据的方式:
im = ImageGrab.grab()
im.save("tempServer.png")
im.close()
with open("tempServer.png", "rb") as f:
msg = f.read()
send_data_by_protocol_in_chunks(msg, client_socket)
这是“ send_data_by_protocol_in_chunks()”函数:
def send_data_by_protocol_in_chunks(data, client_socket):
num_of_chunks = len(data) // CHUNKS_LEN
for i in range(num_of_chunks + 1):
send_data_by_protocol(data[i * CHUNKS_LEN: (i + 1) * CHUNKS_LEN], client_socket)
send_data_by_protocol(END_CODE, client_socket)
这是“ send_data_by_protocol()”函数:
def send_data_by_protocol(msg, client_socket):
msg_length = len(str(msg))
message_by_protocol = f"{msg_length:<{MES_LEN_SPACE}}{msg}".encode('utf-8')
client_socket.send(message_by_protocol)
在客户端:
main()
img_bytes = get_image(my_socket)
print(len(img_bytes))
with open("ImageData.txt", "w") as f:
f.write(img_bytes)
“ get_image()”函数:
def get_image(my_socket):
img = ''
temp = get_data(my_socket, True)
while END_CODE not in temp:
img += temp
temp = get_data(my_socket, True)
return img
“ get_data()”函数:
def get_data(my_socket, is_image=False):
data_len = my_socket.recv(MES_LEN_SPACE).decode('utf-8') # to receive data we will use the recv method, which gets number of bytes
data_len = int(data_len)
data = my_socket.recv(data_len).decode('utf-8')
if END_CODE not in data:
return data[2:-1] if is_image else data
else:
return END_CODE
我要在那里剪切数据(data [2:-1]),因为我得到了一串字节,这意味着我可以得到类似的东西:
"b\'\\x.......\\x##\'"
,我想删除最后的“ b \'”和“ \'”。
我的计算机说无法读取我在客户端保存的图像。 我应该怎么做才能使计算机读取文件? 我希望得到一些帮助。