qt 5 对图片解析
Qt中QImage类封装了对于一般图像像素级的操作,图像显示则使用QPixmap。
本文说说对一般图像(常见格式,图像不大)的处理,比如将彩×××像处理为灰度图像。首先要获得源图像数据,对源图像数据进行处理,将结果保存并显示。
QImage*img;//原图像QImage*grayImg;//处理后灰度图像
1.获得原图像数据
采用此方法即可,
unsigned
char
*data=img->bits();
//获取图像像素字节数据的首地址
这里要注意,采用bits()方法的到的数据data中像素的组织形式应为ARGB,但实际调试中发现,每个像素中从字节从低到高依次是BGRA,方向刚好反过来。在处理彩×××像时尤其注意。下面会解释这样排列顺序的原因。
2.灰度处理
1intwidth=img->width();//图像宽2intheight=img->height();//图像高34intbytePerLine=(width*24+31)/8;//图像每行字节对齐56graydata=newunsignedchar[bytePerLine*height];//存储处理后的数据78unsignedcharr,g,b;9for(inti=0;i<height;i++)10{11for(intj=0;j<width;j++)12{13r=*(data+2);14g=*(data+1);15b=*data;1617graydata[i*bytePerLine+j*3]=(r*30+g*59+b*11)/100;18graydata[i*bytePerLine+j*3+1]=(r*30+g*59+b*11)/100;19graydata[i*bytePerLine+j*3+2]=(r*30+g*59+b*11)/100;2021data+=4;22}23}
上述代码中要注意字节对齐,否则可能处理完后的图像会变形扭曲。此外要注意r/g/b三值的获得,下面解释其具体原因。
首先,data指针是存放在栈中的,在windows中栈是向低地址扩展的数据结构(与此对应,堆是向高地址扩展的数据结构)。在小端存储模式下,低地址存放低有效字节,栈中数据的结构如下图所示:
3.显示图像
1grayImg=newQImage(graydata,width,height,bytePerLine,QImage::Format_RGB888);2ui.label->setPixmap(QPixmap::fromImage(*grayImg));
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。