質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

241閲覧

Visual Studio 2022でバイト配列にしたbmpファイルがC++builderで開けない

OKU

総合スコア1

C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2024/10/01 10:13

実現したいこと

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側で受けとったバイト配列に違いがないのは確認しました

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kikukiku

2024/10/01 23:58

送信データが正しいかどうかを判別するために、 バイト配列をファイルとして保存することで 画像ファイルにし、それを画像ビューアで閲覧してみてはどうでしょうか? このテストで、送信側か、受信側かの判別が付くと思います。
kikukiku

2024/10/01 23:59

送信側、受信側の両方に問題がある場合もあります。
guest

回答1

0

ざっと調べた限り、TBitmap は PNG に対応してないように思えます。TPngImage を使う必要があるのでは。
もしくは、ImageFormat::Bmp で出力するか。

投稿2024/10/01 13:21

int32_t

総合スコア21599

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問