天天看點

QImage 圖像格式小結(1)

http://www.cnblogs.com/Romi/archive/2012/12/03/2800039.html

Qt中QImage類封裝了對于一般圖像像素級的操作,圖像顯示則使用QPixmap。

本文說說對一般圖像(常見格式,圖像不大)的處理,比如将彩色圖像處理為灰階圖像。首先要獲得源圖像資料,對源圖像資料進行處理,将結果儲存并顯示。

QImage *img;//原圖像
QImage *grayImg;//處理後灰階圖像      

1.獲得原圖像資料

QImage 圖像格式小結(1)

采用此方法即可,

unsigned

char

*data=img->bits();

//擷取圖像像素位元組資料的首位址

這裡要注意,采用bits()方法的到的資料data中像素的組織形式應為ARGB,但實際調試中發現,每個像素中從位元組從低到高依次是BGRA,方向剛好反過來。在處理彩色圖像時尤其注意。下面會解釋這樣排列順序的原因。

2.灰階處理

QImage 圖像格式小結(1)
1 int width=img->width();//圖像寬
 2 int height=img->height();//圖像高
 3 
 4 int bytePerLine=(width*24+31)/8;//圖像每行位元組對齊
 5 
 6 graydata=new unsigned char[bytePerLine*height];//存儲處理後的資料
 7 
 8 unsigned char r,g,b;
 9 for (int i=0;i<height;i++)
10 {
11     for (int j=0;j<width;j++)
12     {
13         r = *(data+2);
14         g = *(data+1);
15         b = *data;
16 
17         graydata[i*bytePerLine+j*3]  =(r*30+g*59+b*11)/100;
18         graydata[i*bytePerLine+j*3+1]=(r*30+g*59+b*11)/100;
19         graydata[i*bytePerLine+j*3+2]=(r*30+g*59+b*11)/100;
20 
21         data+=4;
22     }
23 }      
QImage 圖像格式小結(1)

上述代碼中要注意位元組對齊,否則可能處理完後的圖像會變形扭曲。此外要注意r/g/b三值的獲得,下面解釋其具體原因。

首先,data指針是存放在棧中的,在windows中棧是向低位址擴充的資料結構(與此對應,堆是向高位址擴充的資料結構)。在小端存儲模式下,低位址存放低有效位元組,棧中資料的結構如下圖所示:

QImage 圖像格式小結(1)

3.顯示圖像

1 grayImg=new QImage(graydata,width,height,bytePerLine,QImage::Format_RGB888);
2 ui.label->setPixmap(QPixmap::fromImage(*grayImg));