如何将 pygame.image.save 输出到变量而不是文件?
How to output pygame.image.save to a variable instead of a file?
我想使用 socket
库将 pygame.surface.Surface
发送到另一台计算机。我尝试使用 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
object with pygame.image.save()
:
import io
temp_io = io.BytesIO()
pygame.image.save(my_surface, temp_io, "JPEG")
另一种选择是使用 PLI Image
and io.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")
我想使用 socket
库将 pygame.surface.Surface
发送到另一台计算机。我尝试使用 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
object with pygame.image.save()
:
import io
temp_io = io.BytesIO()
pygame.image.save(my_surface, temp_io, "JPEG")
另一种选择是使用 PLI Image
and io.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")