找回密码
 立即注册
收起左侧

QLabel加载图片撕裂

4
回复
18992
查看
[复制链接]
累计签到:2 天
连续签到:1 天
来源: 2021-3-7 12:10:51 显示全部楼层 |阅读模式
1Qter豆
    if(data.size()<(1024)) return;    if(static_cast<uint8_t>(data.at(0))!=0xFF && static_cast<uint8_t>(data.at(1))!=0xD8 && static_cast<uint8_t>(data.at(data.size()-2))!=0xFF && static_cast<uint8_t>(data.at(data.size()-1))!=0xD9) return;
    QPixmap pix;    pix.loadFromData(data);    if(pix.isNull()==false) itemPix->setPixmap(pix.scaled(ui->graphicsView_camera->size()-QSize(2,2),Qt::KeepAspectRatio));

附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2021-3-7 12:15:27 显示全部楼层
data为JPG图片数据,QByteArray类型,在开始处有对图片大小,JPG数据的开头字节,结尾字节有过判断,0xFFD8 / 0xFFD9, 理因为完整数据,不可能有接收不全的现象,要不然起始与结尾字节就不可能不完整了,但显示还是有撕裂
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2021-3-7 12:18:33 显示全部楼层
QByteArray data 的数据为网络传过来的,但程序已经检查过数据包的开头与结尾字节,不应有问题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2021-3-7 12:32:14 显示全部楼层
摄像头数据为 linux-arm -> V4L2 直接采集的摄像头 JPG 数据,没有经过转换, 用网络发给Qt(Windows)端户端显示,用Qlabel显示有撕裂,但如果用正点原子的网络摄像头程序接收显示则是正常,说明发送端完全正常,且性能非常好,可以发到好几M字节的速率,30帧以上的帧率,但是用Qt显示就出现了图像撕裂的问题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2021-3-7 12:36:42 显示全部楼层
本帖最后由 wlq19911021 于 2021-3-7 12:37 编辑

显示事件完整代码:

void MainWindow::slot_receiveFrame(QByteArray data)          //接收帧
{
static int i=0;
QString path=QDir::homePath()+"/data/";
QDir().mkdir(path);
path+=QString::number(i++)+".jpg";
qDebug() << path;

if(data.size()<(1024)) return;
if(static_cast<uint8_t>(data.at(0))!=0xFF && static_cast<uint8_t>(data.at(1))!=0xD8 && static_cast<uint8_t>(data.at(data.size()-2))!=0xFF && static_cast<uint8_t>(data.at(data.size()-1))!=0xD9) return;

QPixmap pix;
pix.loadFromData(data);
if(pix.isNull()==false) itemPix->setPixmap(pix.scaled(ui->graphicsView_camera->size()-QSize(2,2),Qt::KeepAspectRatio));

//if(pix.isNull()==false) itemPix->setPixmap(pix);
ui->label_frameRate->setText(QString::number(exTool::frameRate()));
ui->label_byteRate->setText(QString::number(0.001*exTool::byteRate(static_cast<uint32_t>(data.size())))+"  kb/s");
//tcpClient->sendData("tcp client test ok!!!    sendData...\r\n");
tcpServer->sendData("TCP Server test OK!\r\n");

pix.save(path,"JPG");

}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了