QImage对一般图像的处理

转载 2015年11月21日 15:12:50

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

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




【Qt开发】将内存图像数据封装成QImage V2

如何将内存图像数据封装成QImage 当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放、旋转)操作。如果能够将内存图像数据封装成QImage,则可以利用QImage强大...
  • LG1259156776
  • LG1259156776
  • 2016年08月25日 21:36
  • 1299

用QImage创建合成的图片(一张图片堆叠在另一张图片上)

用QImage创建合成的图片
  • dsncml
  • dsncml
  • 2015年12月26日 09:42
  • 1302

QImage 图像格式小结

嗯,这个QImage的问题研究好久了,有段时间没用,忘了,已经被两次问到了,突然有点解释不清楚,我汗颜,觉得有必要重新总结下了,不然无颜对自己了。 图像的数据是以字节为单位保存的,每一行的字节数必须...
  • aizhaoyu
  • aizhaoyu
  • 2013年10月11日 09:53
  • 12644

QT图像处理示例,包括QImage的处理。

  • 2011年07月01日 10:30
  • 283KB
  • 下载

QImage对一般图像的处理

Qt中QImage类封装了对于一般图像像素级的操作,图像显示则使用QPixmap。 本文说说对一般图像(常见格式,图像不大)的处理,比如将彩色图像处理为灰度图像。首先要获得源图像数据,对源图像数...
  • my_friend_ship
  • my_friend_ship
  • 2014年10月12日 11:46
  • 386

QImage对一般图像的处理

Qt中QImage类封装了对于一般图像像素级的操作,图像显示则使用QPixmap。 本文说说对一般图像(常见格式,图像不大)的处理,比如将彩色图像处理为灰度图像。首先要获得源图像数据,对源图像数据进...
  • b5w2p0
  • b5w2p0
  • 2014年08月21日 20:06
  • 671

Qt之图像处理QImage

1.QImage 这几天在处理gif格式的图片,目的是:将gif图片的背景设置为透明第一步,将gif的每一帧分离出来,这里偷懒了,直接度娘了一个分离工具直接分离了。 第二部,设置透明色(这个是重点...
  • dgj8300
  • dgj8300
  • 2016年04月16日 22:07
  • 363

QImage 图像格式小结

嗯,这个QImage的问题研究好久了,有段时间没用,忘了,已经被两次问到了,突然有点解释不清楚,我汗颜,觉得有必要重新总结下了,不然无颜对自己了。 图像的数据是以字节为单位保存的,每一行的字节数...
  • huangli19870217
  • huangli19870217
  • 2014年07月31日 13:42
  • 406

QImage 图像格式小结

嗯,这个QImage的问题研究好久了,有段时间没用,忘了,已经被两次问到了,突然有点解释不清楚,我汗颜,觉得有必要重新总结下了,不然无颜对自己了。 图像的数据是以字节为单位保存的,每一行的字节数必须...
  • lyc_daniel
  • lyc_daniel
  • 2013年06月03日 15:47
  • 1415

QImage的save函数保存的bmp图像无法打开

最近在VS2010中用QT写一个小的程序,现在出现了一个问题实在不知道怎么解决。。。 用save功能可以得到一个.bmp文件,但是不能读取这个图片的内容,而且每次截图图片的大小都是150K不变。。。...
  • lyc_daniel
  • lyc_daniel
  • 2015年12月30日 16:58
  • 1954
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QImage对一般图像的处理
举报原因:
原因补充:

(最多只允许输入30个字)