Qt 中如何将图片转化为yuv420p

使用 QImage 存储的图片,如果想转成yuv420p 发送出去,该怎么办呢?

        QImage 存储图片有多种格式,可以通过image.format() 查看当前的格式;

        建议通过将格式转换为mage.convertToFormat(QImage::Format_RGB888),这样rgb的存储每个八字节,按照rgb rgb 的格式存储;image.bitPlaneCount() 可以查看一个像素点需要用的bit数;

       默认是 QImage::Format_ARGB32_Premultiplied格式,此时一个像素用四个字节存储,按照argb argb的格式,不同的格式转换为yuv420p的时候,由于rgb的数据排列方式不同,需要采用不同的计算方式,因此建议转化为QImage::Format_RGB888;

        这里给出计算方式:


#include <QtGui/QImage>
#include <QtCore/QByteArray>/*
origin_image  QImage图片
width /height  图片的宽度/高度
yuvData   yuv420p数据
*/ 
void convertRGBToYUV420P1(const QImage& origin_image, int width, int height, QByteArray& yuvData)
{QImage image ;// 将图片转换为指定大小image = origin_image.scaled(width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);qDebug() << "Format:" << image.format();image = image.convertToFormat(QImage::Format_RGB888);qDebug() << "Format:" << image.format();// 提取RGB数据QByteArray rgbData;const int bytesPerLine = image.width() * image.bitPlaneCount()/8;qDebug() << "image:" << "width= " << image.width() << ";height:" << image.height()<< "bytesPerLine:" <<bytesPerLine;for (int y = 0; y < image.height(); ++y) {const uchar* scanline = image.constScanLine(y);rgbData.append(reinterpret_cast<const char*>(scanline), bytesPerLine);}qDebug() << "image:bitPlaneCount"   << image.bitPlaneCount()/8;// 将RGB数据转换为YUV420PFILE* fpyuv = fopen("d:/test/out_200x200_yuv420p.yuv", "wb");const uchar* rgbPtr = reinterpret_cast<const uchar*>(rgbData.constData());int w = image.width(), h = image.height();unsigned char b, g, r;unsigned char* ybuf = new unsigned char[w * h];unsigned char* ubuf = new unsigned char[w * h / 4];unsigned char* vbuf = new unsigned char[w * h / 4];unsigned char* y = ybuf;unsigned char* u = ubuf;unsigned char* v = vbuf;// //图像是以RGB排序的,图像数据是左上角为图像第一个像素,从左往右,从上往下排列的for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {//    rgbPtr++;r = *rgbPtr++;g = *rgbPtr++;b = *rgbPtr++;unsigned char Y = (unsigned char)((66 * r + 129 * g + 25 * b + 128) >> 8) + 16;*y = Y;y++;/*yuv420的uv采样规则:一行一行的扫描采样,每一行都会采集U或V在偶数行的偶数列位置采集U,奇数行的奇数列位置采集V整体采样比例y:u:v=4:1:1YUV 4:2:0 并不是说不采样V分量,这个0是因为每次都是隔行采集U和V,如果第一行是 4:2:0,下一行就是 4:0:2,再下一行又是 4:2:0,以此类推如图:每一个2x2的子块中,左上角采集u,右小角采集v*/if (i % 2 == 0&& j % 2 == 0) {unsigned char  U = (unsigned char)((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;*(u++) = U;}else if (i % 2 != 0 && j % 2 != 0) {unsigned char V = (unsigned char)((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;*(v++) = V;}}}yuvData.append(reinterpret_cast<const char*>(ybuf), w * h);yuvData.append(reinterpret_cast<const char*>(ubuf), w * h/ 4);yuvData.append(reinterpret_cast<const char*>(vbuf), w * h/ 4);//yuv420p,先写y,再写u,在写vfwrite(ybuf, 1, w * h, fpyuv);fwrite(ubuf, 1, w * h / 4, fpyuv);fwrite(vbuf, 1, w * h / 4, fpyuv);fclose(fpyuv);delete[] ybuf;delete[] ubuf;delete[] vbuf;
}

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

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

相关文章

硬盘基本知识(磁头、磁道、扇区、柱面)

概述 盘片&#xff08;platter&#xff09; 磁头&#xff08;head&#xff09; 磁道&#xff08;track&#xff09; 扇区&#xff08;sector&#xff09; 柱面&#xff08;cylinder&#xff09; 盘片 片面 和 磁头 硬盘中一般会有多个盘片组成&#xff0c;每个盘片包含两个面…

Eviews 11安装包下载及安装教程

Eviews 11下载链接&#xff1a;https://docs.qq.com/doc/DUmRGdXVUeVBSU1lK 1.选中下载好的安装包&#xff0c;右键解压到“Eviews 11”文件夹 2.选中"Setup.exe"鼠标右键选择以管理员身份运行 3.点击“Next” 4.勾选“I Accept...”&#xff0c;点击“Next” 5.选择…

理解String 及 String.intern() 在实际中的应用

1. 首先String不属于8种基本数据类型&#xff0c;String是一个对象。     因为对象的默认值是null&#xff0c;所以String的默认值也是null&#xff1b;但它又是一种特殊的对象&#xff0c;有其它对象没有的一些特性。   2. new String()和new String(“”)都是申明一个…

记一次 .NET某工控 宇宙射线 导致程序崩溃分析

一&#xff1a;背景 1. 讲故事 为什么要提 宇宙射线, 太阳耀斑 导致的程序崩溃呢&#xff1f;主要是昨天在知乎上看了这篇文章&#xff1a;莫非我遇到了传说中的bug&#xff1f; &#xff0c;由于 rip 中的0x41变成了0x61出现了bit位翻转导致程序崩溃&#xff0c;截图如下&am…

Jenkins接口调用

Jenkins是好用&#xff0c;但是接口文档写的稀烂 1、授权&#xff0c;Jenkins不推荐使用创建单个任务时创建的token&#xff0c;推荐这个用户下的创建user token。 点击自己账号信息&#xff0c;即可创建token。 2、postman选择basic auth&#xff0c;输入账号密码&#xff0…

CentOS 7 基于官方源码和openssl制作openssh 9.6 rpm包(含ssh-copy-id) —— 筑梦之路

之前写了一篇&#xff1a; CentOS 7 制作openssh 9.6 rpm包更新修复安全漏洞 —— 筑梦之路_升级openssh9.6-CSDN博客 有好几个网友反馈&#xff0c;ssh-keygen生成密钥存在问题&#xff0c;之前的rsa \ dsa加密算法用不了&#xff0c;因此写了一篇&#xff1a; 关于openssh…

MMDETECTION3D 使用kitti格式的数据集跑centerpoint模型

MMDETECTION3D 使用kitti格式的数据集跑centerpoint模型 1 修改配置文件configs/centerpoint/centerpoint_pillar02_kitti_3d.py 如下 # """configs/centerpoint/centerpoint_pillar02_kitti_3d.py""" _base_ = [../_base_/datasets/centerpo…

nginx 二、配置域名

文章目录 一、配置本地域名查看虚拟机ip修改hosts文件测试域名是否配置成功 二、配置aliyun域名三、实践1.创建html2.配置nginx3.测试服务器内部测试页面测试 总结 docker中启动nginx容器完成如下操作&#xff0c;对于docker安装nginx可以看这篇文章 nginx 一、安装与conf浅析 …

Linux上搭建YApi

YApi是http接口管理和测试的重要工具&#xff0c;其作用相当于原来用的postman&#xff0c;但是比postman有更多的功能&#xff0c;本篇文章主要介绍如何在linux环境中快速的安装&#xff08;利用yum命令安装&#xff09;和部署YApi 一、nodejs 安装 1.1 下载nodejs包 yum i…

Harbor配置同步规则删除不掉

【问题原因】 harbor上主从两个仓库&#xff0c;配置同步规则时&#xff0c;定时任务配置太频繁&#xff0c;导致规则修改&#xff0c;删除都失败。 【问题现象】 点击修改后保存&#xff0c;页面报internal server error的错。 【问题排查】 docker ps | grep harbor 查看…

Linux 系统 curl 命令详解

curl 是一个功能强大的命令行工具&#xff0c;用于与 Web 服务器进行数据通信。它支持多种协议&#xff0c;如 HTTP、HTTPS、FTP、SFTP、SMTP 等&#xff0c;并提供了丰富的选项和参数来执行各种操作&#xff0c;如发送请求、下载文件、上传文件等。下面我将详细介绍 curl 命令…

仓库管理软件有哪些比较好用?

“仓库管理软件有哪些比较好用&#xff1f;” “好用&#xff0c;却不一定适合。” 有时候&#xff0c;不是某个仓库管理软件不好用&#xff0c;而是它不适合你们企业。 制造业企业的仓库管理场景&#xff0c;随着制造业企业规模的扩大&#xff0c;逐步精细化&#xff0c;企…

JAVA基础学习笔记-day12-泛型

JAVA基础学习笔记-day12-泛型 1. 泛型概述1.1 泛型的引入 2. 使用泛型举例2.1 集合中使用泛型2.2 相关使用说明 3. 自定义泛型结构3.1 泛型的基础说明3.2 自定义泛型类或泛型接口3.2.1 说明3.2.2 注意 3.3 自定义泛型方法3.3.1 说明 4. 泛型在继承上的体现5. 通配符的使用5.1 通…

C语言KR圣经笔记 5.6指针数组;指针的指针

5.6 指针数组&#xff1b;指针的指针 因为指针本身也是变量&#xff0c;所以它们也能像其他变量一样保存在数组里面。我们写个程序来说明&#xff0c;该程序将一些文本行按照字母顺序排列&#xff0c;算是 UNIX 程序 sort 的精简版本。 在第三章中&#xff0c;我们介绍了对一…

10-链表-删除排序链表中的重复元素 II

这是链表的第10篇算法&#xff0c;这是上一篇文章的加强版&#xff0c;力扣链接。 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,…

Facebook选品方法大揭秘,这几个最畅销类目别错过!

现在越来越多的卖家开始做社媒电商&#xff0c;其中很多人都想在 Facebook 这个平台上分一杯羹&#xff0c;而 Facebook选品对于这些商家来说非常重要。俗话说&#xff0c;七分靠选品&#xff0c;三分靠运营&#xff0c;想成功入局 Facebook&#xff0c;选品选的好&#xff0c…

肠道重要属——芽孢杆菌属,益生与病原双标签

谷禾健康 芽孢杆菌属&#xff08;Bacillus&#xff09;是革兰氏阳性、杆状、芽孢杆菌科细菌的一个属&#xff0c;属于厚壁菌门。 芽孢杆菌属物种可以是专性需氧微生物(依赖氧气)或兼性厌氧微生物(具有需氧或厌氧的能力)。当使用或存在氧气时&#xff0c;它们的过氧化氢酶检测呈…

Stable Diffusion汉化插件

今天为大家介绍Stable Diffusion的两种UI汉化包&#xff0c;一种是汉化包&#xff0c;就中文界面&#xff0c;方便大家对于繁杂的参数的模型的操作&#xff0c;一种是中英文对照界面&#xff0c;在中文提示下&#xff0c;同时显示英文&#xff0c;不但方便设置也同时学习了英文…

MySQL进阶篇(一)存储引擎

一、MySQL 体系结构 &#xff08;1&#xff09; 连接层 最上层是一些客户端和链接服务&#xff0c;包含本地 sock 通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念&#xff…

MySQL中的JSON数据类型计数及多张表COUNT的数据相加

1.使用场景&#xff1a;在MySQL中&#xff0c;JSON作为一种数据类型存储在表的列中。需计算键值对的数量。 2.方法&#xff1a;SELECT COUNT(chief>$.number) FROM t_projectapplication where id #{id};&#xff08;t_projectapplication&#xff1a;表&#xff1b;chief&…