2013-10-05 40 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

相关问题