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

最新文章

  1. C#模拟Http请求时出现 基础连接已经关闭 未能为 SSLTLS 安全通道建立信任关系
  2. Swift开发第九篇——Any和AnyObject&amp;typealias和泛型接口
  3. 生成 PDF 全攻略【1】初体验
  4. Rocky4.2下安装达梦(DM)6数据库
  5. SQL Server 存储引擎-剖析Forwarded Records
  6. Facebook 和 Google 如何激发工程师的创造力
  7. Difference between Pragma and Cache-control headers?
  8. Android InputMethodManager输入法简介
  9. django系列7:修改404页面展示,优化模板,降低urlconf和模板之间的耦合,命名app将模板和app绑定
  10. spring自动注入是单例还是多例?单例如何注入多例?
  11. python time 和 datetime模块
  12. MySQL的一些操作(学习记录_备忘)
  13. ILBC 规范 2
  14. toFixed方法的bug
  15. ImportError: cannot import name cbook
  16. 《Python》常用内置模块
  17. spring-dao.xml 模板
  18. #JS 获取屏幕分辨率、网页可见区域等
  19. python之模块datetime 常见操作
  20. vivado自定IP例化的问题,怎么生成VHDL的例化

热门文章

  1. 用画小狗的方法来解释Java中的值传递
  2. C/C++心得-从内存开始
  3. Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version) 【区间更新 线段树】
  4. Educational Codeforces Round 55 (Rated for Div. 2) C. Multi-Subject Competition 【vector 预处理优化】
  5. php各种设计模式简单实践思考
  6. 20、Springboot 与数据访问(JDBC/自动配置)
  7. viewsate用法
  8. 20145223 杨梦云 《网络对抗》shellcode实验+return-to-libc实验
  9. 陈正冲老师讲c语言之内存的申请malloc() 和释放free()
  10. c++构造函数详解(转)