C++ QPixmap::loadFromData()不接受从TCP/IP接收的JPG数据
几天后,我尝试通过TCP将JPG数据发送到QT接口。所有图像都是由另一个进程生成的,这使得一些基于GPU的图像处理成为可能。网络拓扑如下图所示: 编辑 发射机侧 以前,数据通过算法处理为BMP24图像。之后,BMP图像被压缩/编码为JPGs,以减少网络流量。编码是使用以下函数中使用的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
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, ¶m, ¶m_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();
QPixmap::load(path_to.JPG)从硬盘加载JPG图像时,
图像正确显示在GUI中。(注意,JPG是在加载前几毫秒由发射器生成的)QT是否可能在内部进行转换?注意:JPEG有许多变体。QT没有说明支持哪些JPG格式。它只是说支持JPG和JPEG。此外,读取硬盘上的JPG文件也可以,尽管内容与TCP发送的数据完全相同。“接收到的数据与从硬盘加载的数据完全不同,无论两者是否具有相同的源。"-您没有显示任何代码如何实际发送和接收数据,尽管如果接收到的数据与预期的数据不同,我预计会出现问题。@One3Three7提供a我现在解决了问题。错误在发送器端。指针数组的引用不正确,没有指向jpg buffers。所以这不是基于QT或TCP的问题。不过,谢谢@hyde您的方法帮助我解决了问题!