Python スクリプトを使用して、ウェブカメラで撮影した画像をソケットを使用して ac# webserver に送信するプロジェクトに取り組んでいます。現在、次のようなコードを使用して、Python クライアントからサーバーに文字列を送信しています。
info = bytearray("Text to send", "UTF-8")
socket.send(info)
c# サーバーにデータを送信すると、テキストと数値に対して完全に機能します。.bmp から読み取ったデータを「UTF-8」にエンコードしようとすると、特定の文字を UTF-8 にエンコードできないというエラーが返されるため、問題が発生します。
これを c# が認識できるようにエンコードする方法を誰かが知っているかどうか、またはこのプロセスを実装するためのより良い方法があれば、私はすべて耳を傾けています。
私が思いついたいくつかのオプションは、1-Googleドライブのようなものを使用して画像を保存するか、FTPサーバーに保存してからc#サーバーにそこから取得させるか、2-RGB値を含むパケットシステムを作成しますサーバー上のそれらのピクセル値から画像を再作成します。
ご協力いただきありがとうございます。
編集:この方法でファイルを送信しようとしました
data = bytearray("123456789","UTF-8")
file = open("image.bmp", "rb")
data += file.read()
socket.send(data)
文字列「123456789」を正常に取得できましたが、これ以降のデータはゴミです。データを送信する前にファイルのサイズを送信することも実装しました。そのサイズ番号は正常に取得されますが、img データは黒い bmp として保存されます。
編集2:
これは、メモリ ストリームを使用してイメージを再作成するために使用しているサーバー コードとクライアント コードです。クライアントコードは、hcalves によって言及されたプロセスを使用しています。
クライアント
if __name__ == "__main__":
sock = socket.socket()
sock.connect(("localhost", 50839))
with open("image.bmp", "rb") as fd:
buf = fd.read(1024)
while (buf):
sock.send(buf)
buf = fd.read(1024)
sock.close()
サーバ
Socket client = server.AcceptSocket();
NetworkStream stream = new NetworkStream(client);
byte[] imgData = new byte[1024];
MemoryStream memstream = new MemoryStream();
stream.Read(imgData,0, 1024);
int counter = 0;
while (stream.DataAvailable)
{
memstream.Write(imgData, 0, 1024);
stream.Read(imgData, 0, 1024);
counter = counter + 1024;
}
memstream.Seek(0, SeekOrigin.Begin);
using (Stream file = File.OpenWrite("img.bmp"))
{
byte[] buffer = new byte[8*1024];
int len;
while ((len = memstream.Read(buffer, 0, buffer.Length)) > 0)
{
file.Write(buffer,0,len);
}
}