音視訊技術應用(5)-使用QT渲染RGB資料的一個簡單示例
阿新 • • 發佈:2021-11-12
這裡演示使用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影象。