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

QImage对一般图像的处理相关推荐

  1. Qt QImage 加载 BMP 图像的一个BUG

    这个问题源于水木社区的一个帖子:https://www.mysmth.net/nForum/#!article/KDE_Qt/27466 经过测试 QImage 加载像素数大于 16384*16384 ...

  2. Mat 类型转 QImage 类型

    转自:https://blog.csdn.net/liyuanbhu/article/details/86307283 void Dialog::Mat2QImage(Mat image) {//图片 ...

  3. QImage QPixmap Mat区别

    cvMat可以通过自定义函数转换为QImage Qimage通过fromImage函数 可以转换为QPixmap 绘图设备是指继承QPainterDevice的子类.Qt一共提供了四个这样的类,分别是 ...

  4. Qt图片绘图类QPixmap、QImage、QPicture

    绘图设备是指继承 QPaintDevice 的子类,你可以使用 QPainter 直接在其上面绘制图形,Qt 一共提供了四个这样继承 QPaintDevice 的绘图设备类,分别是:QPixmap.Q ...

  5. QImage图像格式解读

    enum QImage::Format QImage::Format_Invalid 图像无效 QImage::Format_Mono 存储使用1位每像素的图像,字节填充最重要位第一 QImage:: ...

  6. QImage 图像格式小结,QImage::Format

    文章转载自: https://blog.51cto.com/tracey2076/539690 嗯,这个QImage的问题研究好久了,有段时间没用,忘了,已经被两次问到了,突然有点解释不清楚,我汗颜, ...

  7. QImage 图像格式小结 Format_RGB32

    原文链接 嗯,这个QImage的问题研究好久了,有段时间没用,忘了,已经被两次问到了,突然有点解释不清楚,我汗颜,觉得有必要重新总结下了,不然无颜对自己了. 图像的数据是以字节为单位保存的,每一行的字 ...

  8. Qt QImage与OpenCV Mat转换

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51029382 应一个朋友的要求,整理总 ...

  9. QT 之绘图进阶: 图片绘图类QPixmap、QImage、QPicture

    前言 绘图设备是指继承 QPaintDevice 的子类,你可以使用 QPainter 直接在其上面绘制图形,Qt 一共提供了四个这样继承 QPaintDevice 的绘图设备类,分别是:QPixma ...

最新文章

  1. Android中Broadcast
  2. SpeedTree导入到虚幻UE4的注意事项
  3. 2020年余丙森概率统计强化笔记-第三章 二维随机变量及其分布- 第四章 数字特征
  4. python查看函数参数_python函数参数
  5. 向量空间模型(VSM)在文档相似度计算上的简单介绍
  6. QT学习:认识QMainWindow
  7. [react] 高阶组件(HOC)有哪些优点和缺点?
  8. 【BZOJ3223】文艺平衡树,Splay反转区间
  9. 6-14 Inspector s Dilemma uva12118(欧拉道路)
  10. 【Redis】redis数据类型及应用场景
  11. raise NotImplementedError
  12. logback mysql 中文乱码_[Logback+slf4j]MysqlDBAppender正确配置方法以及错误处理
  13. 使用hiredis接口(Synchronous API)编写redis客户端
  14. 小米3g刷高格固件_高恪可刷机型清单
  15. gcc编译链中i686和x86-64有什么区别?
  16. 京东把 Elasticsearch 到底用的有多牛?日均5亿订单查询完美解决!
  17. H5微信分享 自定义图标和内容(以及二次分享图片丢失的解决办法)
  18. 动手深度学习笔记(四十)7.4. 含并行连结的网络(GoogLeNet)
  19. 乌班图18.04搭建ssh服务器
  20. 双卡android手机SIM卡信息探索 ,获取手机 SIM卡数量和SIM卡id、iccid

热门文章

  1. 【计算机组成原理】定点乘法运算之补码一位乘法(Booth算法)
  2. android 代码设置像素,【Android实例】用设计原则来重构1像素保活代码
  3. JAVA 字符串格式化-String.format()的使用(转)
  4. 并发编程之——写锁源码分析
  5. Android Eclipseproject开发中的常见调试问题(二)android.os.NetworkOnMainThreadException 异常的解决的方法...
  6. 信息系统安全等级保护备案任务详单
  7. DEDECMS中,会员中心的常用知识
  8. JFreechart 在linux下不显示及中文乱码问题
  9. 说明Android应用调用全屏方式
  10. prettier 指“北”