使用python发送屏幕截图

使用python发送屏幕截图,python,sockets,Python,Sockets,我正在尝试截图,并使用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_socke

我正在尝试截图,并使用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:]

from PIL import ImageGrab
import socket


server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 1112))
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)
print(size)
print(photo_to_send)
client_socket.send(bytes(str(size), 'utf-8'))

client_socket.send(photo_to_send)
客户:

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")

import socket
from PIL import Image

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

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

the_photo = my_socket.recv(size)

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

可以使用序列化图像对象。Pickle只是将python对象转换为字节。只需将其编码为字节并解码回来


希望这有帮助

问题在于,您正在发送数据本身之前的长度文本值。例如,如果图像数据以
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))

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

问题是我对照片进行了两次编码。 谢谢你的帮助! 我真的很感激

以下是解决方案:

服务器:

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:]

from PIL import ImageGrab
import socket


server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 1112))
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)
print(size)
print(photo_to_send)
client_socket.send(bytes(str(size), 'utf-8'))

client_socket.send(photo_to_send)
客户:

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")

import socket
from PIL import Image

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

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

the_photo = my_socket.recv(size)

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


struct
pickle
让一切变得简单

server.py

imageBytes = pickle.dumps(image)
sock.sendall(struct.pack("L", len(imageBytes)) + imageBytes)
client.py

data = b""
payload_size = struct.calcsize("L")
while True:
    data += sock.recv(payload_size)
    packedImageSize = data[:payload_size]
    imageSize = struct.unpack("L", packedImageSize)[0]
    data = data[payload_size:]
    while len(data) < imageSize:
        data += sock.recv(65000)
    frameData = data[:imageSize]
    data = data[imageSize:]
    frame = pickle.loads(frameData)
data=b“”
有效载荷大小=结构calcsize(“L”)
尽管如此:
数据+=sock.recv(有效负载大小)
packedImageSize=数据[:有效负载大小]
imageSize=struct.unpack(“L”,packedImageSize)[0]
数据=数据[有效载荷大小:]
而len(data)
messagePack似乎是更安全的选择。我认为对于图像,pickle会更好。我会尝试了解并使用它。谢谢你的帮助!!我真的很感激你想用哪种交通工具?你有什么问题?我的问题是客户端没有得到所有的字节,或者他得到了很多字节。结果,客户得到的图片非常模糊。谢谢你的帮助!非常感谢你的帮助!不幸的是,这并没有解决我的问题。我的问题是服务器发送的字节和客户端获取的字节有点不同。