天天看點

Qt中QImage類像素的顔色分量排布驗證

在建立QImage時可以設定其format,例如有Format_ARGB32、Format_RGB888等,在程式中使用了Format_ARGB32和Format_RGB888兩種格式,說明下這兩種格式下像素中每個顔色分量的分布情況。

Format_ARGB32格式下,一個像素占用4個位元組,每個像素的四個位元組分别代表該像素的BGRA值。

驗證方法:

int imgH = 720;
int imgW = 1280;
int iChannel = 4;
QImage imageData = new QImage(imgW, imgH, QImage::Format_ARGB32);
//給像素指派
uchar picData = imageData->bits();
for (int i = 0; i < imgH; i++) {
for (int j = 0; j < imgW; j++) {
        picData[i * imgW * iChannel + j * iChannel + 0] = 0x00;
        picData[i * imgW * iChannel + j * iChannel + 1] = 0x00;
        picData[i * imgW * iChannel + j * iChannel + 2] = 0xFF;//R
        picData[i * imgW * iChannel + j * iChannel + 3] = 0xFF;//A
        
        /*
        picData[i * imgW * iChannel + j * iChannel + 0] = 0x00;
        picData[i * imgW * iChannel + j * iChannel + 1] = 0xFF;//G
        picData[i * imgW * iChannel + j * iChannel + 2] = 0x00;
        picData[i * imgW * iChannel + j * iChannel + 3] = 0xFF;//A

        picData[i * imgW * iChannel + j * iChannel + 0] = 0xFF;//B
        picData[i * imgW * iChannel + j * iChannel + 1] = 0x00;
        picData[i * imgW * iChannel + j * iChannel + 2] = 0x00;
        picData[i * imgW * iChannel + j * iChannel + 3] = 0xFF;//A
        */
}
}
           

上述代碼可以生成紅綠藍三張圖檔,通過QLabel控件可以顯示出來,代碼如下:

//Qt上顯示
QPixmap pixmap1   = QPixmap::fromImage(*imageData);
QLabel *pic_show = ui->showWindow;
pixmap1.scaled(pic_show->geometry().width(),
               pic_show->geometry().height(),
               Qt::KeepAspectRatio);
           pic_show->setPixmap(pixmap1);
pic_show->setScaledContents(true);
           

同樣方法也可以驗證Format_RGB888格式的像素排布,每一個像素占用三個位元組,每個像素的三個位元組分别表示R、G、B顔色分量,驗證代碼如下:

int imgH = 720;
int imgW = 1280;
int iChannel = 3;
QImage imageData = new QImage(imgW, imgH, QImage::Format_RGB888);
//給像素指派
uchar picData = imageData->bits();
for (int i = 0; i < imgH; i++) {
for (int j = 0; j < imgW; j++) {
        picData[i * imgW * iChannel + j * iChannel + 0] = 0xFF;//R
        picData[i * imgW * iChannel + j * iChannel + 1] = 0x00;
        picData[i * imgW * iChannel + j * iChannel + 2] = 0x00;
        
        /*
        picData[i * imgW * iChannel + j * iChannel + 0] = 0x00;
        picData[i * imgW * iChannel + j * iChannel + 1] = 0xFF;//G
        picData[i * imgW * iChannel + j * iChannel + 2] = 0x00;

        picData[i * imgW * iChannel + j * iChannel + 0] = 0x00;
        picData[i * imgW * iChannel + j * iChannel + 1] = 0x00;
        picData[i * imgW * iChannel + j * iChannel + 2] = 0xFF;//B
        */
}
}
           

上述代碼可以生成紅綠藍三張圖檔,通過QLabel來測試。

繼續閱讀