【问题标题】:How to output pygame.image.save to a variable instead of a file?如何将 pygame.image.save 输出到变量而不是文件?
【发布时间】:2020-12-22 08:39:01
【问题描述】:

我想使用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 格式,但我希望它占用尽可能少的字节)

【问题讨论】:

    标签: python python-3.x pygame pygame2


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 263kb,更好但仍然太多,png文件需要163kb,jpg文件需要45kb。我们正在谈论互联网。
    • @mhn2 您使用的是哪种解决方案?
    • 我是用io把它写在一个变量里,然后用zlib压缩成jpg文件。
    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多