音视频技术应用(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图像。

 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   夜行过客  阅读(920)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示