Pygame: отправка изображения по сети PodSixNet - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь отправить изображение по сети с помощью PodSixNet. Как я это делаю:

Клиентская сторона:

    #...
    image = pygame.image.load("character.png")
    img = pygame.image.tostring(image, "RGBA")
    connection.Send({"action":"setPlayerCharacter", 'playerName': self.playerName, 'playerImage': img})

Серверная сторона:

  def Network_setPlayerCharacter(self, data):
    self.playerName = data['playerName']

    img = data['playerImage']
    self.playerImage = pygame.image.fromstring(img, (50, 50), "RGBA")
    self._server.SendPlayers() # Send data to other players

Но PodSixNet не любит байты. Получение этой ошибки:

error: uncaptured python exception, closing channel <__main__.ClientChannel 127.0.0.1:54822 at 0x3925ef0> (<class 'UnicodeDecodeError'>:'utf-8' codec can't decode byte 0xff in position 1611: invalid start byte [C:\Users\Mikal\AppData\Local\Programs\Python\Python37-32\lib\asyncore.py|read|83] [C:\Users\Mikal\AppData\Local\Programs\Python\Python37-32\lib\asyncore.py|handle_read_event|422] [C:\Users\Mikal\AppData\Local\Programs\Python\Python37-32\lib\asynchat.py|handle_read|171] [C:\Users\Mikal\AppData\Local\Programs\Python\Python37-32\lib\site-packages\PodSixNet\Channel.py|found_terminator|21] [C:\Users\Mikal\AppData\Local\Programs\Python\Python37-32\lib\site-packages\PodSixNet\rencode.py|loads|333] [C:\Users\Mikal\AppData\Local\Programs\Python\Python37-32\lib\site-packages\PodSixNet\rencode.py|f|320] [C:\Users\Mikal\AppData\Local\Programs\Python\Python37-32\lib\site-packages\PodSixNet\rencode.py|decode_string|196])

Есть ли способ обойти это?

1 Ответ

0 голосов
/ 08 марта 2019

Я не знаком с PodSixNet, но простым способом решения этой проблемы является кодировка Base64 данных двоичных изображений.

import base64
...

image       = pygame.image.load( "tiny_alien.png" )
image_bytes = pygame.image.tostring( image, "RGBA" )
image_str   = base64.b64encode( image_bytes ).decode('iso-8859-1') # ASCII(ish)

По любой причине модуль base64 возвращает байтовидный объект, не строку, поэтому его необходимо дополнительно декодировать.

Обратите внимание, что есливы используете base64.a85encode(...) результирующая строка будет значительно меньше.

С другой стороны, используйте base64.b64decode(...), чтобы снова вернуть строку в двоичный файл:

image_bytes = base64.b64decode( image_str ) # back to pygame.tostring() format
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...