Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QPixmap::loadFromData()不接受从TCP/IP接收的JPG数据_C++_Qt_Tcp_Jpeg - Fatal编程技术网

C++ QPixmap::loadFromData()不接受从TCP/IP接收的JPG数据

C++ QPixmap::loadFromData()不接受从TCP/IP接收的JPG数据,c++,qt,tcp,jpeg,C++,Qt,Tcp,Jpeg,几天后,我尝试通过TCP将JPG数据发送到QT接口。所有图像都是由另一个进程生成的,这使得一些基于GPU的图像处理成为可能。网络拓扑如下图所示: 编辑 发射机侧 以前,数据通过算法处理为BMP24图像。之后,BMP图像被压缩/编码为JPGs,以减少网络流量。编码是使用以下函数中使用的 void CudaBase::encodeBmpToJpeg(unsigned char* idata, uint8_t* odata, int* p_jpeg_size, int width, int heig

几天后,我尝试通过TCP将JPG数据发送到QT接口。所有图像都是由另一个进程生成的,这使得一些基于GPU的图像处理成为可能。网络拓扑如下图所示:

编辑

发射机侧

以前,数据通过算法处理为BMP24图像。之后,BMP图像被压缩/编码为JPGs,以减少网络流量。编码是使用以下函数中使用的

void CudaBase::encodeBmpToJpeg(unsigned char* idata, uint8_t* odata, int* p_jpeg_size, int width, int height)
{
    ... // init stuff
    gpujpeg_encoder_input_set_image(&encoder_input, idata); // pass idata which contains interleaved BMP24 data
    gpujpeg_encoder_encode(encoder, &param, &param_image, &encoder_input, &image, p_jpeg_size);  // encode BMP24 to JPG, variable image holds compressed JPG data
    gpujpeg_image_save_to_file(image_dir, image, *p_jpeg_size);  // save JPG on harddrive
    CUDA_CHECK(cudaStreamSynchronize(stream));
    // Copy JPG from image to odata 
    odata = (uint8_t*) malloc(*p_jpeg_size);
    if(odata != nullptr)
        memcpy((void*)odata, (void*)image, *p_jpeg_size);
    else
        printf("Could not allocated memory for jpeg image\n");
    CUDA_CHECK(cudaStreamDestroy(stream));
    gpujpeg_image_destroy(image);
    gpujpeg_encoder_destroy(encoder);
}
现在,
odata
包含JPG数据,可以通过TCP发送,具体操作如下:

socket.make_tcp_header(&header, nof_recieved_records, nof_records, ch);
socket.send(&header, sizeof(header));
socket.waitForACK();
socket.send(images[ch], algthm.getImageSize()); // images[ch] points to odata
socket.waitForACK();
这就是发射机发送信号的方式

template <typename T>
void Socket::send(T* ptr, int count)
{
    printf("Writing to server... \n");
    int result = 0;
    int _size = count;
    do
    {
        result = write(sockfd, (void*)ptr, _size);
        if(result == -1)
        {
            printf("Error sending to server: %d\n",errno);
            _size = 0;
        }
        else
        {
            _size -= result;
        }
    }
    while(_size > 0);
}
编辑到此结束

下面的函数是一个插槽,当客户机线程接收到新的(原始)数据时发出

void Controller::refresh_image()
{
    tcp_header *header = socket->getHeader(); // Get header informations from threaded socket
    QPixmap pix;
    switch(header->format) 
    {
        case BMP24:
        {
            QImage img(socket->getData(),
                header->img_width,
                header->img_height,
                QImage::Format_RGB888);
            pix = QPixmap::fromImage(img);
            break;
        }
        case JPEG:
        {
            if(!(pix.loadFromData(socket->getData(), "JPG"))) // Every time return zero
                qDebug() << "Not able to load pixmap from data";
            break;
        }
    }
    // Reload images in GUI
    view->label_list()->at(header->current_channel)->setPixmap(pix);
    view->update();
}
void控制器::刷新\u图像()
{
tcp_header*header=socket->getHeader();//从线程套接字获取头信息
QPixmap-pix;
开关(标题->格式)
{
案例BMP24:
{
QImage img(套接字->获取数据(),
标题->图像宽度,
收割台->仪表板高度,
QImage::格式(RGB888);
pix=QPixmap::fromImage(img);
打破
}
案例JPEG:
{
if(!(pix.loadFromData(socket->getData(),“JPG”))//每次返回零
qDebug()label_list()->at(header->current_channel)->setPixmap(pix);
查看->更新();
}
注意
tcp\u头文件
是我自己设置的结构,是我自己的tcp协议的一部分。根据头文件的不同,会显示BMP或JPG图像。显示BMP图像不会出现任何问题

调试后,我注意到以下几点:

socket.make_tcp_header(&header, nof_recieved_records, nof_records, ch);
socket.send(&header, sizeof(header));
socket.waitForACK();
socket.send(images[ch], algthm.getImageSize()); // images[ch] points to odata
socket.waitForACK();
  • 发送器发送的JPG数据与接收的数据完全相同。此外,元数据和BMP也正确接收

  • 当接收器使用
    QPixmap::load(path_to.JPG)从硬盘加载JPG图像时,
    图像正确显示在GUI中。(注意,JPG是在加载前几毫秒由发射器生成的)

  • 接收到的数据与从硬盘加载的数据完全不同,无论两者是否具有相同的源

  • 传输的字节大小与硬盘上的字节大小完全相同。接收器和发射器上的数据类型均为uint8_t

  • 传输的数据与从硬盘加载的数据不同的原因可能是什么


    QT是否可能在内部进行转换?

    注意:JPEG有许多变体。QT没有说明支持哪些JPG格式。它只是说支持JPG和JPEG。此外,读取硬盘上的JPG文件也可以,尽管内容与TCP发送的数据完全相同。“接收到的数据与从硬盘加载的数据完全不同,无论两者是否具有相同的源。"-您没有显示任何代码如何实际发送和接收数据,尽管如果接收到的数据与预期的数据不同,我预计会出现问题。@One3Three7提供a我现在解决了问题。错误在发送器端。指针数组的引用不正确,没有指向jpg buffers。所以这不是基于QT或TCP的问题。不过,谢谢@hyde您的方法帮助我解决了问题!