QImage對一般映像的處理

來源:互聯網
上載者:User

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));

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.