QImage对一般图像的处理
2015-11-21 15:12
357 查看
Qt中QImage类封装了对于一般图像像素级的操作,图像显示则使用QPixmap。
本文说说对一般图像(常见格式,图像不大)的处理,比如将彩色图像处理为灰度图像。首先要获得源图像数据,对源图像数据进行处理,将结果保存并显示。
1.获得原图像数据
采用此方法即可,
这里要注意,采用bits()方法的到的数据data中像素的组织形式应为ARGB,但实际调试中发现,每个像素中从字节从低到高依次是BGRA,方向刚好反过来。在处理彩色图像时尤其注意。下面会解释这样排列顺序的原因。
2.灰度处理
上述代码中要注意字节对齐,否则可能处理完后的图像会变形扭曲。此外要注意r/g/b三值的获得,下面解释其具体原因。
首先,data指针是存放在栈中的,在windows中栈是向低地址扩展的数据结构(与此对应,堆是向高地址扩展的数据结构)。在小端存储模式下,低地址存放低有效字节,栈中数据的结构如下图所示:
3.显示图像
FROM: http://www.cnblogs.com/Romi/archive/2012/12/03/2800039.html
本文说说对一般图像(常见格式,图像不大)的处理,比如将彩色图像处理为灰度图像。首先要获得源图像数据,对源图像数据进行处理,将结果保存并显示。
QImage *img;//原图像 QImage *grayImg;//处理后灰度图像
1.获得原图像数据
采用此方法即可,
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
相关文章推荐
- QPixmap vs. QImage
- Application中的路径
- 苏州OJ c001: 合并同类项
- 迷迷糊糊的把CentOS7在新机器上安装成功了
- Java8のStream学习
- 吓死宝宝了——PATH 环境变量配错了,ll或ls命令都找不到了
- Qt5调用QPixmap::fromWinHICON
- mysql用户创建和权限管理
- 仿QQ5.0侧滑菜单——自定义属性
- mac下汇编hello world
- Qt实现图像自适应窗口大小之scaled()函数使用
- 提交Python 代码到Spark
- hibernate一对一主键关联单向(一)
- 关于hashcode()的作用
- 【spring】aop切面通知,日志处理
- iOS 原生二维码扫描(可限制扫描区域)
- Rouh set 入门知识1(基础定义篇)
- 初衷
- 试试hadoo
- 使用REST服务下载excel文件