2015-05-26 108 views
2

我刚开始使用PIL和Pygame,我想创建一个屏幕共享程序。 为了截取我使用ImageGrab.grab()的截图,现在我想将它发送到另一台计算机并在Pygame中打开它,而不将它保存在任何计算机上。 这是现在我的服务器:在不保存python的情况下发送图像

#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() 

我试图以发送图像用泡菜,但我响应了一个错误。 所以我正在寻找一种方法来发送我通过套接字使用ImageGrab捕获的图像,并在另一台计算机上用Pygame打开它,而不必将其保存在任何计算机上。 任何人都可以帮助我吗?我正在使用Python 2.6和Windows 7. 预先感谢您!

回答

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()load()函数,将StringIO用作文件对象,(大致)记录为here。正如jsbueno提到的,这最后的解决方案可以节省相当长的一段带宽...

+0

我得到一个“AttributeError的:tobytes”的错误,当我试图使用方法: img.tobytes() 上也是如此Image.frombytes (args) 也许我以错误的方式使用它们?你能给我一个正确使用的例子吗? – PyStudent51

+0

参阅我编辑的答案。 –

+1

此外,这将发送原始图像数据,这是_huge_ - 通过使用StringIO /(BytesIO)方法,您可以在发送图像之前将图像编码为.png或.jpg,并可节省大量(高达90%)带宽, – jsbueno

相关问题