1. 程式人生 > 其它 >音視訊技術應用(5)-使用QT渲染RGB資料的一個簡單示例

音視訊技術應用(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影象。