2015-05-26 68 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

相關問題