音视频技术应用(5)-使用QT渲染RGB数据的一个简单示例
这里演示使用QT渲染一幅 宽高为1280 * 720的 红色RGB图像。
首先需要理解RGB三原色,每个颜色其实都可以用一个byte(0~255)来表示,若R = 0, G = 0, B = 0,用16进制表示则是0x000000, 也就是黑色;若R = 255, G = 255, B = 255,用16进制表示则是0xFFFFFF, 也就是白色。通过给RGB三原色赋不同的值,可以混合成其它颜色。我们这里要显示纯红色的图像的话,R = 255, G = 0, B = 0, 用十六进制表示就是0xFF0000;
下面具体演示一下:
1. 首先新建一个QT项目:
2. 在testrgb.h 中重写 QT 绘制画面的函数: void paintEvent(QPaintEvent *ev)
#pragma once #include <QtWidgets/QWidget> #include "ui_testrgb.h" class TestRGB : public QWidget { Q_OBJECT public: TestRGB(QWidget *parent = Q_NULLPTR); // 重写绘制画面的函数 void paintEvent(QPaintEvent *ev) override; private: Ui::TestRGBClass ui; };
3. 在testrgb.cpp中重写绘制画面的函数,并增加下列的code:
#include "testrgb.h" #include <qpainter.h> #include <qimage.h> static int w = 1280; static int h = 720; TestRGB::TestRGB(QWidget *parent) : QWidget(parent) { ui.setupUi(this); // 重新设定窗口的大小为1280 * 720 resize(w, h); } void TestRGB::paintEvent(QPaintEvent* ev) { QImage img(w, h, QImage::Format_RGB888); auto data = img.bits(); // 这里采用的像素格式是RGB888,意味着每个像素点有3个RGB分量组成 // j 表示行数 for (int j = 0; j < h; j++) { // line_R 表示每一行的第一个R分量的位置 // 比如 // 第一行的第一个R分量的下标为: 0 = 1280(每一行的像素数) * 3(单个像素占用的字节数) * 0(行号) // 第二行的第一个R分量的下标为:3840 = 1280(每一行的像素数) * 3(单个像素占用的字节数) * 1(行号) int line_R = w * 3 * j; // i = 0 表示的是这一行的第1个R分量,i = 3 表示的是每一行的第2个R分量,i=6 表示的是每一行的第三个R分量,依此类推... // 通过 i + 1 可以取得R分量后面紧跟的G分量,i + 2可以取得G分量后面跟的B分量 for (int i = 0; i < w * 3; i+=3) { data[line_R + i] = 255; // R data[line_R + i + 1] = 0; // G data[line_R + i + 2] = 0; // B } } QPainter p; p.begin(this); p.drawImage(0, 0, img); p.end(); }
代码注释已经写得很清楚了,就不再赘述了,其中的 img.bits 用于取得对象内部存储的图像数据,接下来的操作其实相当于是给对象内部的图像数据赋值。
运行:
可以看到很容易就能生成一张宽高为1280 * 720的 红色RGB图像。
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
分类:
音视频技术应用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探