【Python3】ソケット通信でPillowのイメージを送信する方法(UDP)

おはこんばんにちは、せなです。
今回は、UDPでソケット通信を行う際にPillowの画像イメージを送信する方法を説明したいと思います。

送信側の処理

処理の流れとしては以下のようになります。

  1. ソケットを作成する。
  2. 画像の読み込みとサイズの変更を行う。(サイズが大きいとバイト数が肥大化するため)
  3. Bytesオブジェクトに変換する。
  4. Bytesオブジェクトをbyteに変換する。
  5. sendtoでデータを送信する。
from socket import socket, AF_INET, SOCK_DGRAM

from PIL import Image
import io
import pickle

PORT = 5000
# 自分に送信
ADDRESS = "127.0.0.1"

try:
    # ソケット作成
    sock = socket(AF_INET, SOCK_DGRAM)
    # 読み込み・サイズ変更
    img = Image.open("1.jpg").resize((300, 300))
    # BytesIoに変換
    img_io = io.BytesIO()
    img.save(img_io, format="JPEG")
    # オブジェクトの直列化
    img_bytes = pickle.dumps(img_io)
    # 送信
    sock.sendto(img_bytes, (ADDRESS, PORT))
except KeyboardInterrupt:
    print("終了します")
    # ソケットを閉じる
    sock.close()

受信側の処理

処理の流れとしては以下のようになります。

  1. ソケットを作成する。
  2. bindでIPアドレスとポート番号を指定する。
  3. recvfromでデータを受信する。
  4. 受信データを復元する。
  5. Bytesオブジェクトからイメージを復元する。
from socket import socket, AF_INET, SOCK_DGRAM

from PIL import Image
import io
import pickle

HOST = ""
PORT = 5000

# ソケット作成
sock = socket(AF_INET, SOCK_DGRAM)
# バインド
sock.bind((HOST, PORT))

while True:
    try:
        # 受信
        msg, address = sock.recvfrom(65535)
        # オブジェクトの復元
        data = pickle.loads(msg)
        # BytesIoから復元
        content = data.getvalue()
        # 画像を保存
        img = Image.open(io.BytesIO(content))
        # img = img.resize((600, 600))
        img.save("test.jpg")

    except KeyboardInterrupt:
        print("終了します")
        sock.close()

最後に

UDPのソケット通信で画像データの送信を行う方法を記載してみました。
TCPで送受信を行うよりも早く処理ができるので、正確性を求めない状況なら積極的に使用したいですね。

ではでは〜

Python

Posted by sena