0

我是 QT 和 C++ 的新手,我正在尝试使用 QThreadpools 创建一个 QTcpserver,以便它可以处理多个客户端。多个客户端可以毫无问题地连接。但我正在尝试从安卓手机发送一张带有页脚“IMGPNG”的图像,表示图像数据的结束。现在发出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

调用readAll()不会总是读取完整的图像,因为它显然无法知道图像的大小。它只会读取所有当前可用的字节,这些字节可能小于您的整个文件,或者如果发件人速度非常快并且您无法赶上阅读,则更多。同样的方式readyRead()只会通知您有可用的字节,但不会通知您已收到整个文件。它可能是一个字节或数百个字节。

要么您首先知道图像的大小,因为它始终是固定的,要么发送者必须告诉接收者他想要发送的字节数。

然后,您可以忽略所有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);

                }
            }

       }

终于在运行方法上保存了图像-> SaveImage,@DavidSchwartz,你帮了大忙,谢谢。感谢你的帮助。

于 2013-02-07T16:04:40.270 回答