1. 程式人生 > >【Qt開發】QT中顯示影象資料

【Qt開發】QT中顯示影象資料

一般影象資料都是以RGBRGBRGB……位元組流的方式(解碼完成後的原始影象流),我說成位元組流,那就表明R,G,B的值各佔一個位元組,在程式設計時表示的就是unsigned char * data。

       我們先來看一下QT中的QImage物件。在載入data資料前,我們要確定QImage載入影象的空間分配足夠大,先假設data是由640*480畫素的壓縮資料解碼得來的,RGB(3位元組)是一個畫素,故data的應該是640*480*3個位元組;比較一下下面兩種方式:

       QImage img(640,480,QImage::Format_RGB888);//24位
        unsigned char
 * p_bits=img.bits();

24位(3位元組)一個畫素,那麼p_bits所得到的空間應該是640*480*3個位元組,所以剛剛好一個位元組對一個位元組。所以我們這樣賦值即可:

        for(int i=0;i<640*480*3;i+=3)
    {
        puiBits[i]=data[i];
        puiBits[i+1]=data[i+1];
        puiBits[i+2]=data[i+2];
    }


    //接著就是將img轉化成QPixmap填充到QWidget
    QPixmap pixmap=QPixmap::fromImage(img);
    pixmap=pixmap.scaled(widget->size());
    widget->setAutoFillBackground(true);
    QPalette palette;
    palette.setBrush(widget->backgroundRole(), QBrush(pixmap));
    widget->setPalette(palette);
    widget->repaint();

另一種方式:

       unsigned int * p_bits;

       QImage img(640,480,QImage::Format_RGB32);

       p_bits=(uint*)img.bits();

32位(4位元組)一個畫素,那麼p_bits所得到的空間應該是640*480*4個位元組,所以不能以上面的方式賦值。有沒有注意到,這裡用了unsigned int而不用unsigned char;unsigned int是4個位元組的,unsigned char 是1個位元組的,所以我們這裡做的事情是將每一個RGB單元放到p_bits的每個unsigned int(4位元組)中。因為p_bits是unsigned int指標,所以p_bits[i]就是4個位元組。所以應該這樣寫:

        for(int i=0;i<640*480*3;i+=3)
    {
        p_bits[i/3]=qRgb(data[i],data[i+1],data[i+2]);
    }


    //接著就是將img轉化成QPixmap填充到QWidget
    QPixmap pixmap=QPixmap::fromImage(img);
    pixmap=pixmap.scaled(widget->size());
    widget->setAutoFillBackground(true);
    QPalette palette;
    palette.setBrush(widget->backgroundRole(), QBrush(pixmap));
    widget->setPalette(palette);
    widget->repaint();