1

I want to send a pygame.surface.Surface to another computer using socket library. I tried using pygame.image.tostring but it took 900kb, but when I used pygame.image.save and I used jpg format it only took 45kb. But the problem is pygame.image.save output it to a file and pygame.image.load only accepts file, and it slows my program because I need bytes object and reading and writing a file 32 times per second will kill the cpu. What sould I do to transform a pygame.surface.Surface to a bytes but in jpg format without reading and writing files 32 times per second?
(It doesn't need to be jpg format but I want it take least possible bytes)

mhn2
  • 119
  • 9

1 Answers1

1

An alternative option would be to use zlib to compress the string:

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

Or save the image to an io.BytesIO object with pygame.image.save():

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

Another option is to use PLI Image and io.BytesIO, which gives you more flexibility in choosing the format:

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")
Rabbid76
  • 202,892
  • 27
  • 131
  • 174