如何将 pygame.image.save 输出到变量而不是文件?

问题描述

我想使用 pygame.surface.Surface 库将 socket 发送到另一台计算机。我尝试使用 pygame.image.tostring 但它占用了 900kb,但是当我使用 pygame.image.save 并且我使用 jpg 格式时它只占用了 45kb。但问题是 pygame.image.save 将它输出一个文件,而 pygame.image.load 只接受文件,它减慢了我的程序,因为我需要字节对象并且每秒读写文件 32 次会杀死 cpu。我应该怎么做才能将 pygame.surface.Surface 转换为 bytes 但以 jpg 格式而不每秒读写文件 32 次?
(它不需要是 jpg 格式,但我希望它占用尽可能少的字节)

解决方法

另一种选择是使用 zlib 来压缩字符串:

import zlib
image_str = pygame.image.tostring(my_image)
compressed_image_str = zlib.compress(image_str)

或者使用 io.BytesIO 将图像保存到 pygame.image.save() 对象:

import io
temp_io = io.BytesIO()
pygame.image.save(my_surface,temp_io,"JPEG")

另一种选择是使用 PLI Imageio.BytesIO,这使您可以更灵活地选择格式:

from PIL import Image
import io
pil_string_image = pygame.image.tostring(my_surface,"RGB",False)
pli_image = Image.frombytes('RGB',my_surface.get_size(),pil_string_image,'raw')
temp_io = io.BytesIO()
pli_image.save(temp_io,format="JPEG")

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...