在python中发送图像而不保存它

时间:2015-05-26 13:25:28

标签: python image sockets pygame python-imaging-library

我刚开始使用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。 提前谢谢!

1 个答案:

答案 0 :(得分:4)

您可以使用Image.tobytes()获取原始图片的数据,并使用Image.frombytes(),cf http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.tobyteshttp://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所提到的,最后一个解决方案可以节省相当多的带宽...