简体   繁体   English

Pygame:通过网络发送图像PodSixNet

[英]Pygame: Send image over the network PodSixNet

I am trying to send an image over the network with PodSixNet. 我正在尝试使用PodSixNet通过网络发送图像。 How I am doing this: 我是怎么做的:

Client side: 客户端:

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

Server side: 服务器端:

  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

But PodSixNet does not like bytes. 但是PodSixNet不喜欢字节。 Getting this error: 收到此错误:

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

Any way around this? 可以解决吗?

I'm not familiar with PodSixNet, but a simple way around this seems to be a Base64 encoding of the binary image data. 我不熟悉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)

For whatever reason, the base64 module returns a bytes-like object, not a string, so it needs to be further decoded. 无论出于何种原因,base64模块都会返回类似字节的对象, 而不是字符串,因此需要对其进行进一步解码。

Note that if you use base64.a85encode(...) the resultant string will be significantly smaller. 请注意,如果使用base64.a85encode(...)则生成的字符串将大大减小。

On the other side, use base64.b64decode(...) to get the string back to a binary again: 另一方面,使用base64.b64decode(...)将字符串再次恢复为二进制:

image_bytes = base64.b64decode( image_str ) # back to pygame.tostring() format

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM