Qt UDP传送图片

news2025/1/11 21:00:49

Qt UDP传送图片,server发送,client接收。

 server

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QPainter>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QFont font;
    font.setPixelSize(16);
    setFont(font);
    setWindowTitle(QStringLiteral("UDP Server"));
    ui->label->setMaximumHeight(ui->pushButton->sizeHint().height());

    mUdpSocket = new QUdpSocket(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    Q_UNUSED(event);

    mFlag = true;
    mUdpSocket->close();
}

void MainWindow::on_pushButton_clicked()
{
    QString name;
    int sendCount = 1;
    int size = 0;
    int num = 0;
    int count = 0;
    int endSize = 0;
    ImageFrameHead mes;
    while(1)
    {
        name = QStringLiteral("./data/%1.jpg").arg(sendCount, 3, 10, QLatin1Char('0'));
        mFile.setFileName(name);
        mFile.open(QIODevice::ReadOnly);
        char *m_sendBuf = new char[1024];

        size = mFile.size();
        num = 0;
        count = 0;
        endSize = size%996;
        if (endSize == 0)
        {
            num = size/996;
        }
        else
        {
            num = size/996+1;
        }

        while (count < num)
        {
            memset(m_sendBuf, 0, 1024);

            mes.funCode = 24;
            mes.uTransFrameHdrSize = sizeof(ImageFrameHead);
            if ((count+1) != num)
            {
                mes.uTransFrameSize = 996;
            }
            else
            {
                mes.uTransFrameSize = endSize;
            }

            mes.uDataFrameSize = size;
            mes.uDataFrameTotal = num;
            mes.uDataFrameCurr = count+1;
            mes.uDataInFrameOffset = count*(1024 - sizeof(ImageFrameHead));

            mFile.read(m_sendBuf+sizeof(ImageFrameHead), 1024-sizeof(ImageFrameHead));
            memcpy(m_sendBuf, (char *)&mes, sizeof(ImageFrameHead));
            mUdpSocket->writeDatagram(m_sendBuf, mes.uTransFrameSize+mes.uTransFrameHdrSize, QHostAddress("127.0.0.1"), 9930);

            QTime dieTime = QTime::currentTime().addMSecs(1);
            while( QTime::currentTime() < dieTime )
            {
                QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
            }
            qDebug() << "";

            count++;
        }

        delete []m_sendBuf;

        QTime dieTime = QTime::currentTime().addMSecs(10);
        while( QTime::currentTime() < dieTime )
        {
            QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
        }

        ui->label->setText(QStringLiteral("%1").arg(sendCount++));

        if (sendCount == mMaxFileNum + 1)
        {
            sendCount = 1;
        }

        mFile.close();

        if (mFlag)
        {
            break;
        }
    }
}

void MainWindow::on_pushButton_2_clicked()
{
    QImage image("wintersun.jpg");
    QImage image2(image.size(), QImage::Format_ARGB32);

    for (int i = 1; i <= mMaxFileNum; ++i)
    {
        QString name = QStringLiteral("%1").arg(i, 3, 10, QLatin1Char('0'));
        QPainter painter(&image2);
        painter.drawImage(0, 0, image);
        QPen pen(Qt::red);
        QFont font("微软雅黑", 30, QFont::Bold);
        painter.setPen(pen);
        painter.setFont(font);
        painter.drawText(30, 50, name);

        image2.save(QStringLiteral("./data/%1.jpg").arg(name), "jpg", 100);
        ui->label_image->setPixmap(QPixmap::fromImage(image2));
        QCoreApplication::processEvents(QEventLoop::AllEvents);
    }
}

client

#include "mainwindow.h"
#include "ui_mainwindow.h"

UdpThread::UdpThread(QObject *parent) :
    QThread(parent)
{
    m_buf = new char[1024*1024];
    memset(m_buf, 0, 1024*1024);
}

UdpThread::~UdpThread()
{
    m_udpSocket->close();
    delete []m_buf;
}

void UdpThread::run()
{
    m_udpSocket = new QUdpSocket;
    connect(m_udpSocket, SIGNAL(readyRead()), this, SLOT(slotRecv()), Qt::DirectConnection);
    m_udpSocket->bind(QHostAddress("127.0.0.1"), 9930);
    exec();
}

void UdpThread::slotRecv()
{
    char *recvBuf = new char[1052];
    memset(recvBuf, 0, 1052);
    while(m_udpSocket->hasPendingDatagrams())
    {
        memset(recvBuf, 0, 1052);
        int size = m_udpSocket->pendingDatagramSize();
        m_udpSocket->readDatagram(recvBuf, size);

        ImageFrameHead *mes = (ImageFrameHead *)recvBuf;
        if (mes->funCode == 24) {
            memcpy(m_buf+mes->uDataInFrameOffset, (recvBuf+ sizeof(ImageFrameHead)), mes->uTransFrameSize);
            if (mes->uDataFrameCurr == mes->uDataFrameTotal)
            {
                emit sigRecvOk(m_buf, mes->uDataFrameSize);
            }
        }
    }

    delete []recvBuf;
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QFont font;
    font.setPixelSize(16);
    setFont(font);
    setWindowTitle(QStringLiteral("UDP client"));

    m_udpThread = new UdpThread;
    connect(m_udpThread, SIGNAL(sigRecvOk(char*,int)), this, SLOT(slotRecv(char*,int)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    m_udpThread->start();
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    Q_UNUSED(event);

    if (m_udpThread->isRunning())
    {
        m_udpThread->quit();
    }
}

void MainWindow::slotRecv(char * buf, int len)
{
    QPixmap pixmap;
    pixmap.loadFromData((uchar*)buf, len, "JPG");
    ui->label->setPixmap(pixmap);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1017176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

求解灰度直方图,如何绘制灰度直方图(数字图像处理大题复习 P1)

文章目录 1. 画 X 轴2. 画直方图3. Complete 视频原链接 数字图像处理期末考试大题 B站链接 1. 画 X 轴 2. 画直方图 有几个 0 就在图上画多高&#xff0c;同理有几个 1 &#xff0c;X1 的地方就画多高 3. Complete 这里的情况比较平均&#xff0c;一般来说不会这么平均&a…

element -ui table表格内容无限滚动 使用插件vue-seamless-scroll

使用插件 一、安装组件依赖 npm install vue-seamless-scroll 二、引入组件 import vueSeamlessScroll from "vue-seamless-scroll"; components: { vueSeamlessScroll }, <div class"table-list "><vue-seamless-scroll :class-option"…

JavaWeb概念视频笔记

学习地址&#xff1a;102.尚硅谷_Tomcat-Tomcat服务器和Servlet版本的对应关系_哔哩哔哩_bilibili 目录 1.JavaWeb的概念 2.Web资源的分类 3.常用的Web服务器 4.Tomcat服务器和Servlet版本的对应关系 5.Tomcat的使用 a.安装 b.目录介绍 c.如何启动 Tomcat 服务器 另一…

【C语言】指针和数组笔试题解析(1)

指针是C语言的灵魂&#xff0c;他的玩法多种多样&#xff0c;这篇文章带来指针的笔试题详解&#xff0c;可以帮助我们更好的理解与巩固指针的知识 目录 预备知识&#xff1a;题目&#xff1a;一维数组&#xff1a;二维数组&#xff1a; 题目比较多&#xff0c;但切记戒骄戒躁&a…

Selenium常用操作之单选复选框、下拉列表、键盘、截屏、断言、(显式隐式)等待

目录 1. 窗口最大化 2.单选框操作 3. 复选框操作 4. 下拉列表 5. selenium 三种等待 6. 键盘操作 7.截屏 8.断言 9. Selenium操作JS弹窗控件 10.鼠标悬停与释放 1. 窗口最大化 driver.maximize_window() 2.单选框操作 driver.find_element_by_xpath("//input[…

Hdoop伪分布式集群搭建

文章目录 Hadoop安装部署前言1.环境2.步骤3.效果图 具体步骤&#xff08;一&#xff09;前期准备&#xff08;1&#xff09;ping外网&#xff08;2&#xff09;配置主机名&#xff08;3&#xff09;配置时钟同步&#xff08;4&#xff09;关闭防火墙 &#xff08;二&#xff09…

Linux学习第13天:嵌入式LinuxLED驱动开发:一字一符总见情

在正式写这篇笔记前&#xff0c;有一个事情必须要说一下。昨天更新的基于API函数的字符设备驱动开发按照正常的教程来说应该在本笔记后一天更新才对。但是由于我一时的疏忽&#xff0c;跳过了本笔记。在昨天学习基于API函数的时候造成了一定程度的困扰。今天重翻教程的时候才发…

burp+IE 微信小程序抓包教程

文章目录 一、BURP里新增监听端口二、BURP导出证书三、导入证书四、IE代理设置五、小程序抓包实际测试 一、BURP里新增监听端口 找一个没用的端口&#xff0c;使用以下方式新增 二、BURP导出证书 选择刚才新增的监听端口&#xff0c;点击证书导入导出 将其存出来即可&…

Maven知识点总结

Maven 基础课程第一天 第1章 Maven 介绍 1.1什么是 Maven 1.1.1什么是 Maven Maven 的正确发音是[ˈmevən]&#xff0c;而不是“马瘟”以及其他什么瘟。Maven 在美国是一个口语化的词语&#xff0c;代表专家、内行的意思。 一个对Maven 比较正式的定义是这么说的&#xff1…

notepad++ 配置 python 以及Anaconda中的python(已解决)

说明&#xff0c;无论是自己的电脑单独安装的python 还是Anaconda虚拟环境安装的python都是一样的。区别就是 独立安装的python 的exe文件路径添加的环境变量了&#xff0c;不需要制定它的路径直接运行下面的命令就可以&#xff0c;而Anaconda中的python.exe的文件夹并没有在虚…

endnotes插入文献突然变得格式不对,而且也不是按照正常的顺序来插入解决办法

今天插入文献突然变成了endnotes里面的文献序号&#xff0c;而且也不导入了&#xff0c;多了作者和序号信息 解决办法&#xff1a; 更新一下&#xff0c;然后在进行的导入就ok了&#xff0c;能够按照以前的格式插入了&#xff0c;序号也能自动排开&#xff0c;而且也能导入文献…

从CNN(卷积神经网络),又名CAM获取热图

一、说明 卷积神经网络&#xff08;CNN&#xff09;令人难以置信。如果你想知道它如何看待世界&#xff08;图像&#xff09;&#xff0c;有一种方法是可视化它。 这个想法是&#xff0c;我们从最后的密集层中得到权重&#xff0c;然后乘以最终的CNN层。这需要全局平均…

想要精通算法和SQL的成长之路 - 戳气球

想要精通算法和SQL的成长之路 - 戳气球 前言一. 戳气球1.1 记忆化搜索 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 戳气球 原题链接 首先我们看一下题干&#xff1a;对于超出了数组边界的&#xff0c;就当做它是一个数字为1的气球。遇到这种的&#xff0c;我们可以考…

论文解读-DeepEdit:使用纳米孔直接RNA测序对A - to - I RNA编辑事件进行单分子检测和阶段划分

DOI&#xff1a; 10.1186/s13059-023-02921-0 期刊 &#xff1a;Genome Biology 中科院分区&#xff1a;1Q 影像因子&#xff1a;12.3 作者 Longxian Chen; Liang Ou; Xinyun Jing; Yawei Kong; Bingran Xie; et al 出版日期 2023-04-17 网址&#xff1a; https://genome…

Jetpack系列 -- LiveData源码原理解析(解决黏性问题)

一、LiveData是什么&#xff1f; 注意&#xff1a;一般情况下&#xff0c;LiveData要配合ViewModel一起使用的&#xff0c;但是今天是单独使用LiveData&#xff0c;作为学习的话&#xff0c;我们可以只关注LiveData了。 LiveData是一种可观察的数据存储器类。与常规的可观察类…

python-保留小数位数的3种方法

在python实际运用中&#xff0c;需要对小数位数进行截取保留。 以下是&#xff0c;python保留小数点位数的3种方法。 方法一 方法&#xff1a;’%.nf’ % num n代表保留的小数位数&#xff0c;num表示需要截取的目标数 用法如下&#xff1a; old_num 1.23456 new_num %.2f…

[NLP] LLM---<训练中文LLama2(四)方式一>对LLama2进行SFT微调

指令精调 指令精调阶段的任务形式基本与Stanford Alpaca相同。训练方案也采用了LoRA进行高效精调&#xff0c;并进一步增加了可训练参数数量。在prompt设计上&#xff0c;精调以及预测时采用的都是原版Stanford Alpaca不带input的模版。对于包含input字段的数据&#xff0c;采…

竞赛 基于机器学习与大数据的糖尿病预测

文章目录 1 前言1 课题背景2 数据导入处理3 数据可视化分析4 特征选择4.1 通过相关性进行筛选4.2 多重共线性4.3 RFE&#xff08;递归特征消除法&#xff09;4.4 正则化 5 机器学习模型建立与评价5.1 评价方式的选择5.2 模型的建立与评价5.3 模型参数调优5.4 将调参过后的模型重…

yolov5在rk3588上加速

不采用fastdeploy等三方框架&#xff0c;使用rknn-lite2或者rknpu在rk3588上加速&#xff0c;测试加速的是rknn自带的yolov5模型。 备注&#xff1a; 1.测试视频&#xff1a;多人&#xff0c;帧:3000&#xff0c;时长:2min&#xff0c;分辨率:1920x1080&#xff0c;fps:25 2…

傅里叶变换应用 (02/2):频域和相位

一、说明 到目前为止&#xff0c;在我们的讨论中&#xff0c;我已经交替使用了“傅里叶变换”和“快速傅里叶变换&#xff08;FFT&#xff09;”。在这一点上&#xff0c;值得注意的是区别&#xff01;FFT 是“离散”傅里叶变换 &#xff08;DFT&#xff09; 的有效算法实现。“…