0

私はQTとC++の初心者です。複数のクライアントを処理できるように、QThreadpoolsを使用してQTcpserverを作成しようとしています。複数のクライアントが問題なく接続できます。しかし、画像データの終わりを示すフッター「IMGPNG」を使用して、Android携帯から画像を送信しようとしています。さて、readyRead信号が発せられたときの問題は、利用可能なすべてのデータを読み取り、後で文字列操作を実行して画像を再構築しようとしています。各クライアントの完全なイメージを受け取り、それに応じて処理する方法がわかりません。

 void VireClients::readyRead()//read ready
{

 int nsize = socket->bytesAvailable();//trying to check the available bytes

 qDebug()<< "Bytes Available" << nsize;

 while(socket->bytesAvailable() < nsize){

     QByteArray data = socket->readAll();//how to receive all the data and then process it

 }

   /*!These lines call the threadpool instance and reimplement run*/
   imageAnalysis = new VireImageAnalysis(); //creating a new instance of the QRunnable
   imageAnalysis->setAutoDelete(true);
      connect(imageAnalysis,SIGNAL(ImageAnalysisResult(int)),this,SLOT(TaskResult(int)),Qt::QueuedConnection);
   QThreadPool::globalInstance()->start(imageAnalysis);


}

データを完全に取得する方法や、受信したデータを画像形式で保存する方法がわかりません。画像データを完全に受信する方法を知りたいです。助けてください。

4

2 に答える 2

3

toを呼び出すとreadAll()、画像のサイズが明らかにわからないため、画像全体が読み取られるとは限りません。現在使用可能なすべてのバイトのみが読み取られます。これは、ファイル全体よりも少ない場合があります。送信者が非常に高速で、読み取りに追いつかない場合は、それよりも多くなります。同じ方法readyRead()で、使用可能なバイトがあることだけが通知されますが、ファイル全体が受信されたことは通知されません。1バイトまたは数百バイトの場合があります。

画像は常に固定されているため、最初から画像のサイズを知っているか、送信者が受信者に送信したいバイト数を通知する必要があります。

次に、画像サイズと一致readyRead()するまですべての信号を無視し、呼び出して画像全体を一度に読み取ることができます。または、使用可能なバイトがあるときはいつでも読み取り、読み取られたバイト数が受信者が送信するように指示したバイトと一致するまでバッファをいっぱいにします。bytesAvailable()readAll()

于 2012-11-30T13:32:37.427 に答える
0

一時変数の文字列を収集して画像を保存する問題を解決し、最後にopencv imwriteを使用して画像を保存しました。これにより、この問題が解決されました。

 while(iBytesAvailable > 0 )
     {
      if(socket->isValid())
      {
       char* pzBuff = new char[iBytesAvailable];
       int iReadBytes = socket->read(pzBuff, iBytesAvailable);
       if( iReadBytes > 0 )
       {
           result1 += iReadBytes;

            str += std::string(reinterpret_cast<char const *>(pzBuff), iReadBytes);


            if(str.size() > 0){
                search = str.find("IMGPNG");

                if(search == result1-6){

                    finalID = QString::fromStdString(str);

                    Singleton_Global *strPtr = Singleton_Global::instance();
                    strPtr->setResult(finalID);

                    /*!Process the received image here*/
                    SaveImage= new VSaveImage();
                    SaveImage->setAutoDelete(false);
                    connect(SaveImage,SIGNAL(SaveImageResult(QString)),this,SLOT(TaskResult(QString)),Qt::QueuedConnection);
                    threadPool->start(SaveImage);

                }
            }

       }

最後に、runメソッドで画像を保存しました-> SaveImage、@DavidSchwartzありがとうございました。助けてくれてありがとう。

于 2013-02-07T16:04:40.270 に答える