Как вывести pygame.image.save в переменную вместо файла?

avatar
mhn2
22 декабря 2020 в 08:39
158
1
1

Я хочу отправить pygame.surface.Surface на другой компьютер, используя библиотеку socket. Я пытался использовать pygame.image.tostring, но это заняло 900 КБ, но когда я использовал pygame.image.save и использовал формат jpg, это заняло всего 45 КБ. Но проблема в том, что pygame.image.save выводит его в файл, а pygame.image.load принимает только файл, и это замедляет мою программу, потому что мне нужен байтовый объект, а чтение и запись файла 32 раза в секунду убьет процессор. Что мне нужно сделать, чтобы преобразовать pygame.surface.Surface в bytes, но в формате jpg без чтения и записи файлов 32 раза в секунду?
(Это не обязательно должен быть формат jpg, но я хочу, чтобы он занимал как можно меньше байтов)

Источник

Ответы (1)

avatar
Rabbid76
22 декабря 2020 в 08:42
1

Альтернативным вариантом может быть использование 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 Image и io.BytesIO, что дает вам больше гибкости при выборе формата:<546029>

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

mhn2
22 декабря 2020 в 08:46
0

263 КБ, лучше, но все же слишком много, файл png занимает 163 КБ, а файл jpg - 45 КБ. и мы говорим об Интернете.

Rabbid76
22 декабря 2020 в 09:45
0

@ mhn2 Какое решение вы используете?

mhn2
22 декабря 2020 в 11:13
1

Я использую io, чтобы записать его в переменную, а затем использовать zlib для сжатия файла jpg.