66963


送信側

[code]

    import websocket
    from picamera import camera
    import io
    
    class WebSocketClient(object):
        def __init__(self, url, io_loop=None, extra_headers=None):
            self.ws = websocket.WebSocketApp(url)
            self.ws.on_open = self.on_open
            self.state = True
            self.picamera = camera.PiCamera()
            self.picamera.resolution = (920,690) # 4:3
            self.picamera.rotation = 270
    
        def on_open(self):
            self.state = True
            print("open")
            while(self.state):
                stream = io.BytesIO()
                for pixels in Picamera.capture_continuous(stream, "png"):
                    stream.seek(0)
                    data = stream.read()
                    print(type(data))
                    self.ws.send(data)
    
    if __name__ == "__main__":
        websocket.enableTrace(False)
        ws_client = WebSocketClient("ws://SERVER")
        ws_client.ws.run_forever()
    
[/code]

受信側

[code]

    from websocket_server import WebsocketServer
    import threading
    import json
    import sys
    import requests
    import urllib
    
    import traceback
    from PIL import Image, ImageOps
    from io import BytesIO
    import io
    
    
    class message:
        def __init__(self, Type, data):
            self.type = str(Type)
            self.data = str(data)
    
        def to_json(self):
            return json.dumps(self.__dict__, ensure_ascii=False, indent=4)
    
    
    def new_client(client, server):
        print("new")
    
    
    def message_received(client, server, Message):
        try:
            if(len(Message) > 100):
                Message = Message.encode('UTF-8')
                img_from_str = Image.open(Message)
                img_from_str.save('test.png')
        except:
            traceback.print_exc()
    
    
    # Main
    if __name__ == "__main__":
        server = WebsocketServer(port=12345, host='SERVER')
        server.set_fn_new_client(new_client)
        server.set_fn_message_received(message_received)
        print("start")
        server.run_forever()
    
[/code]

としているのですが、PILのImage.open()を使ったところでエラーが出ます

画像データをpython3同士 / websocketにて送受信するサンプルが見つからず、組み合わせて書いているのですが  
エンコード/デコードあたりがあまり自信がありません。  
ご助言いただけると幸いです。


CC BY-SA 4.0
2020-05-25T03:28:36.560
66961
2020-05-27T08:25:04.280
2020-05-27T08:25:04.280
25869
25869
question
python 画像 websocket pil base64
websocketを使いpythonプログラム同士でPiCameraから取得したデータのやり取りをしたい


そのwebsocketライブラリを利用してるかはわかりませんが、Binaryが送受信可能なAPIを探してみると良いと思います。  
`websockets`でのかんたんなサンプルは次のとおりです。画像のPATHは適宜変更してください。

client側

[code]

    # client.py
    import asyncio
    import websockets
    
    async def sendImage():
        uri = "ws://localhost:8765"
        async with websockets.connect(uri) as websocket:
            with open("source/sample.jpg", "rb") as f:
              data = f.read()
              await websocket.send(data)
    
    asyncio.get_event_loop().run_until_complete(sendImage())
    
[/code]

server側

[code]

    # server.py
    import asyncio
    import websockets
    
    async def receiveImage(websocket, path):
        image = await websocket.recv()
        with open("output/sample.jpg", "wb")  as f:
          f.write(image)
          print("Save output/sample.jpg")
    
    start_server = websockets.serve(receiveImage, "localhost", 8765)
    
    asyncio.get_event_loop().run_until_complete(start_server)
    asyncio.get_event_loop().run_forever()
    
[/code]

## 参考

  * <https://websockets.readthedocs.io/en/stable/intro.html>
  * <https://websockets.readthedocs.io/en/stable/api.html#websockets.protocol.WebSocketCommonProtocol.send>
  * <https://websockets.readthedocs.io/en/stable/api.html#websockets.protocol.WebSocketCommonProtocol.recv>


CC BY-SA 4.0
2020-05-25T04:17:41.127
66963
2020-05-25T04:17:41.127
7997
66961
answer