QImage對一般圖像的處理
Qt中QImage類封裝了對於一般圖像像素級的操作,圖像顯示則使用QPixmap。
本文說說對一般圖像(常見格式,圖像不大)的處理,比如將彩色圖像處理為灰度圖像。首先要獲得源圖像數據,對源圖像數據進行處理,將結果保存並顯示。
QImage *img;//原圖像 QImage *grayImg;//處理后灰度圖像
1.獲得原圖像數據

采用此方法即可,
unsigned
char
*data=img->bits();
//獲取圖像像素字節數據的首地址
|
這里要注意,采用bits()方法的到的數據data中像素的組織形式應為ARGB,但實際調試中發現,每個像素中從字節從低到高依次是BGRA,方向剛好反過來。在處理彩色圖像時尤其注意。下面會解釋這樣排列順序的原因。
2.灰度處理
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 }
上述代碼中要注意字節對齊,否則可能處理完后的圖像會變形扭曲。此外要注意r/g/b三值的獲得,下面解釋其具體原因。
首先,data指針是存放在棧中的,在windows中棧是向低地址擴展的數據結構(與此對應,堆是向高地址擴展的數據結構)。在小端存儲模式下,低地址存放低有效字節,棧中數據的結構如下圖所示:

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

