我刚开始使用PIL和Pygame,我想创建一个屏幕共享程序。 为了拍摄截图,我使用了ImageGrab.grab(),现在我想将它发送到另一台计算机并在Pygame中打开它而不将其保存在任何计算机上。 这是我的服务器:
#region - - - - - - I M P O R T S - - - - - -
import socket
import select
from PIL import ImageGrab
import pickle
#endregion
#region - - - - - - C O N S T A N T S - - - - - -
PORT = 8253
CONCURRENT_USERS = 5
#endregion
#region - - - - - - M E T H O D S - - - - - -
def CaptureScreen():
img = ImageGrab.grab()
return img
#endregion
server_socket = socket.socket()
server_socket.bind(('', PORT))
server_socket.listen(CONCURRENT_USERS)
clients_list = []
while True:
read, write, error = select.select([server_socket] + clients_list, [], [], 0)
for i in read:
if i is server_socket:
client_socket, client_address = server_socket.accept()
clients_list.append(client_socket)
for i in clients_list:
img = CaptureScreen()
try:
i.send(pickle.dumps(img))
except socket.error:
clients_list.remove(i)
i.close()
我尝试使用pickle来发送图片,但我收到了错误的回复。 因此,我正在寻找一种方法来发送我使用ImageGrab通过套接字捕获的图像,并在另一台计算机上使用Pygame打开它,而不将其保存在任何计算机上。 谁能帮我?我正在使用Python 2.6和Windows 7。 提前谢谢!
答案 0 :(得分:4)
您可以使用Image.tobytes()
获取原始图片的数据,并使用Image.frombytes()
,cf http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.tobytes和http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.fromstring
Pickle
是一个众所周知的不安全协议FWIW,所以最好坚持使用原始数据。
请注意,这些是PIL的Pillow分支版本2.x中的功能。如果您使用的是原始PIL库且无法更新到Pillow,则必须使用Image.tostring()
和Image.fromstring()
方法,或使用save()
和{{1}使用load()
作为文件对象的函数,(粗略地)记录here。正如jsbueno所提到的,最后一个解决方案可以节省相当多的带宽...