How to save pygame Surface as an image to memory (and not to disk)

匿名 (未验证) 提交于 2019-12-03 08:28:06

问题:

I am developing a time-critical app on a Raspberry PI, and I need to send an image over the wire. When my image is captured, I am doing like this:

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

This is not very efficient. I would like to be able to save the surface as an image in memory and send the bytes directly without having to save it first to disk.

Thanks for any advice.

EDIT: The other side of the wire is a .NET app expecting bytes

回答1:

The simple answer is:

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

and just send the data. But we want to compress it before we send it. So I tried this

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

Seems like the data was written, but I have no idea how to tell pygame what format to use when saving to a StringIO. So we use the roundabout way.

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


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!