首页 > 解决方案 > 使用 python 发送屏幕截图

问题描述

我正在尝试截取屏幕截图并使用 python 将其发送到另一台计算机。我尝试过很多不同的方法。不幸的是,我没有找到办法。我会很感激你的帮助!

服务器:

from PIL import Image
from PIL import ImageGrab
import socket


server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 1111))
server_socket.listen(1)
print('Waiting For Connection...')
(client_socket, client_address) = server_socket.accept()
print('Connected to: ', client_address[0])


img = ImageGrab.grab(bbox=(10, 10, 500, 500))
photo_to_send= img.tobytes()
size = len(photo_to_send)
client_socket.send(bytes(str(size), 'utf-8'))

while size >= 0:
    msg = photo_to_send[:4096]
    client_socket.send(bytes(str(msg), 'utf-8'))
    photo_to_send= photo_to_send[4096:]

客户:

import socket
from PIL import Image


my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
my_socket.connect(('127.0.0.1', 1111))
print("Connected to the server")

size = int(my_socket.recv(1024).decode('utf-8'))

the_photo = ""
the_photo = the_photo.encode('utf-8')

while size > 0:
    data = my_socket.recv(4096)
    size -= len(data)
    the_photo += data


img_to_save = Image.frombytes("RGB", (490,490), the_photo)
img_to_save .save("screenshot.png")

标签: pythonsockets

解决方案


问题是您在数据本身之前立即发送长度的文本值。例如,如果图像数据以 开头AAABBB,您将发送

1234AAABBB...

但如果图像更大,你可能会发送类似的东西

56789AAABBB...

客户端无法判断长度在哪里结束,数据从哪里开始!要解决此问题,您需要发送一个固定大小的长度参数。如果您仍然想要文本长度,您可以使用zfill

client_socket.send(str(size).zfill(16).encode())
...
size = int(my_socket.recv(16).decode())

(选择 16 以使其足够长以适合任何可能的图像尺寸)


这不是非常有效;真正的协议通常使用二进制编码:

client_socket.send(struct.pack('>I', size))
...
size, = struct.unpack('>I', my_socket.recv(4))

但这可能比您的应用程序需要的更复杂。


推荐阅读