python - 使用 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")
解决方案
问题是您在数据本身之前立即发送长度的文本值。例如,如果图像数据以 开头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))
但这可能比您的应用程序需要的更复杂。
推荐阅读
- java - 如何从循环中获取firestore数据并发送到recyclerview适配器
- python - Pandas: Change column of integers to datetime and add a timestamp
- json.net - Why does validation fail in code, but work in Newtonsoft web validator?
- r - R system2成功后退出失败
- android - Mapbox-gl 在 android 模拟器(离子电容器)上崩溃
- linux - mremap 返回大小,但应该返回一个有效的指针
- java - 将 String 中的 Headers 数据转换为 Map
> - flutter - 颤振:堆栈和墨水覆盖
- css - 使用 flex 根据窗口大小将内容显示为行或列
- javascript - Cube.js - 无法加入 2 个或更多表,但不断收到“找不到要加入的加入路径”错误