実現したいこと
Visual Studio 2022でバイト配列に変換したBMP画像をC++builderのImageに表示させたい
発生している問題・分からないこと
Visual StudioでOpencvを使用して取得したカメラ画像をTCP/IP通信でC++builderに送信して取得したバイト配列をTMemoryStreamのLoadFormStreamメソッドを使用すると「ストリームからの読み取りエラー」が発生しました。
Visual Studio側のアプリケーションがTCPサーバー、C++builder側のアプリケーションがTCPクライアントになります。
エラーメッセージ
error
1ストリームからの読み取りエラー.
該当のソースコード
Visual Studio側 IPAddress^ localAddr = IPAddress::Parse("127.0.0.1"); server = gcnew TcpListener(localAddr, mPortNo); // サーバーの開始 server->Start(); // クライアントからの接続を待つ TcpClient^ client = server->AcceptTcpClient(); // ネットワークストリームの取得 NetworkStream^ stream = client->GetStream(); // クライアントからデータを受信 array<Byte>^ bytes = gcnew array<Byte>(1024); int i; i = stream->Read(bytes, 0, bytes->Length); receive_data = Encoding::ASCII->GetString(bytes, 0, i); // クライアントに応答を送信 array<Byte>^ msg = Encoding::ASCII->GetBytes(send_data); stream->Write(msg, 0, msg->Length); // Bitmapデータの送信 // bitmapをmemorystreamに保存してバイト配列に変換 MemoryStream^ memStream = gcnew MemoryStream(); memStream->Position = 0; image->Save(memStream, System::Drawing::Imaging::ImageFormat::Png); // PNGフォーマットで保存 array<Byte>^ imageBytes = memStream->ToArray(); // 画像サイズを先に送信する int imageSize = imageBytes->Length; array<Byte>^ sizeBytes = BitConverter::GetBytes(imageSize); // サイズ情報を送信 stream->Write(sizeBytes, 0, sizeBytes->Length); // 画像データを送信 stream->Write(imageBytes, 0, imageBytes->Length); stream->Flush(); // 接続を閉じる client->Close(); C++builder側 IdTCPClient1->Socket->WriteLn(message); // 受信 String response = IdTCPClient1->Socket->ReadLn(); if (response == "") { Memo1->Lines->Add("fail"); } else { Memo1->Lines->Add(response); } // bitmapデータ // 画像サイズを受信 TIdBytes sizeBytes; IdTCPClient1->IOHandler->ReadBytes(sizeBytes, sizeof(int)); int imageSize = Idglobal::BytesToInt32(sizeBytes, 0); // 画像データを受信 TIdBytes imageBytes; IdTCPClient1->IOHandler->ReadBytes(imageBytes, imageSize); // 受信したデータをTBitmapに変換 TMemoryStream* memStream = new TMemoryStream(); memStream->Write(imageBytes[0], imageSize); Memo1->Lines->Add(memStream->Size); Memo1->Lines->Add(imageSize); Memo1->Lines->Add(imageBytes.size()); memStream->Position = 0; TBitmap* bitmap = new TBitmap(); bitmap->LoadFromStream(memStream);
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
Googleで検索しても特に同様の問題を見つけられませんでした
補足
Visual Studio側から送信する前のバイト配列とC++builder側で受けとったバイト配列に違いがないのは確認しました