【Python3】ソケット通信でPillowのイメージを送信する方法(UDP)
おはこんばんにちは、せなです。
今回は、UDPでソケット通信を行う際にPillowの画像イメージを送信する方法を説明したいと思います。
送信側の処理
処理の流れとしては以下のようになります。
- ソケットを作成する。
- 画像の読み込みとサイズの変更を行う。(サイズが大きいとバイト数が肥大化するため)
- Bytesオブジェクトに変換する。
- Bytesオブジェクトをbyteに変換する。
- 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()
受信側の処理
処理の流れとしては以下のようになります。
- ソケットを作成する。
- bindでIPアドレスとポート番号を指定する。
- recvfromでデータを受信する。
- 受信データを復元する。
- 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で送受信を行うよりも早く処理ができるので、正確性を求めない状況なら積極的に使用したいですね。
ではでは〜
ディスカッション
コメント一覧
まだ、コメントがありません