QTではsocketで画像データ(JPEG)を受信すると直ちに復号表示

1553 ワード

最近、小さなプログラムを作っていますが、機能は簡単です.socketからjpeg形式のデータを返して、本機に表示します.もちろん、このプロセスは受信したデータを保存してから表示するのではなく、データを受け取ってすぐに表示します.
ここでは、OPENCVの復号関数を使用します.
imdecode();
この関数の使い方は煩わしいが、複雑ではない.以下のように.
これはsocket信号を受信する関数です(真ん中にカスタム信号がありますが、これはポイントではありません)
void MainWindow::readDate(QByteArray datagram)//  datagram          ,         ,   UDP  
{

    QString str;
    std::string image;
    static int udp_cnt = 0;//   
    static int udp_all = 0;


    image.assign(datagram.data()+10, datagram.data()+datagram.size());
    if (0 == datagram.at(1))
    {
        udp_all = datagram.at(0);
        udp_cnt = 0;
        imageBuf.clear();


    }
    if (udp_all == datagram.at(0) && udp_cnt == datagram.at(1))//   
    {
        str.sprintf("%d    %d",udp_all, udp_cnt);
        imageBuf = imageBuf + image;
        ++udp_cnt;
        if (udp_cnt >= udp_all)//    
        {
            std::vector  vecImage(imageBuf.begin(), imageBuf.end());
            srcImg = imdecode(Mat(vecImage), CV_LOAD_IMAGE_COLOR);//       vector   ,                vector ,     
            cvtColor(srcImg, srcImg, CV_BGR2RGB);                 //,    ,    !!OPENCV BGR   ,QT RGB,      
            imshow("adf",srcImg);
            waitKey(33);

            this->update();
        }
        //  


    }

//    printf("
data0:%d
",datagram.at(0)); // printf("data1:%d
",datagram.at(1)); // printf("data.size:%d",datagram.size()); }