2013-10-05 76 views
1

我開發一個樹莓派一個時間關鍵應用程序,我需要通過網絡發送的圖像。 當我拍攝圖像時,我做的是這樣的:如何pygame的表面保存爲圖像內存(而不是磁盤)

# pygame.camera.Camera captures images as a Surface 
pygame.image.save(mySurface,'temp.jpeg') 
_img = open('temp.jpeg','rb') 
_out = _img.read() 
_img.close() 
_socket.sendall(_out) 

這是不是很有效。我希望能夠將表面保存爲內存中的圖像,並直接發送字節,而不必先將其保存到磁盤。

感謝您的任何意見。

編輯:導線的另一端是一個.NET應用程序期待字節

+1

你可以使用'pygame.image.tostring'嗎?看起來像你想要的,但我找不到它生成的二進制文件的很好的文檔。 – kalhartt

+0

貌似PIL可以載入這種格式,嘗試通過pygame.image.tostring到PIL,根據需要轉換,然後發送。我時,我可以測試和編寫正確的答案 – kalhartt

+0

@kalhartt嘿,當你寫你的答案,我不認爲你會需要PIL。你可以從'tostring'中取出字符串並在其上使用'pygame.image.fromstring()'。您將必須指定圖像的大小和您使用的格式。一種常見的格式是'RGBA'。 – Shashank

回答

4

簡單的答案是:

surf = pygame.Surface((100,200)) # I'm going to use 100x200 in examples 
data = pygame.image.tostring(surf, 'RGBA') 

,只是發送數據。但我們希望在發送之前對其進行壓縮。所以,我想這個

from StringIO import StringIO 
data = StringIO() 
pygame.image.save(surf, x) 
print x.getvalue() 

好像已寫入數據,但我不知道如何告訴pygame的保存到StringIO的時使用何種格式。所以我們使用迂迴的方式。

from StringIO import StringIO 
from PIL import Image 
data = pygame.image.tostring(surf, 'RGBA') 
img = Image.fromstring('RGBA', (100,200), data) 
zdata = StringIO() 
img.save(zdata, 'JPEG') 
print zdata.getvalue() 
+0

thx,我想我忘了提到管道的另一端是一個需要字節的.NET應用程序。當收件人在Python中時,'tostring'工作得很好。 – jhfelectric

+0

@jhfelectric這兩者都是原始字節串,相當於你從'開放(名稱,「RB」)'得到了什麼 – kalhartt

相關問題