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




相关文章推荐

QImage类

QImage类提供了一个硬件无关的图像表示方法,该图像可以逐像素被访问和用于画图设备。 Qt提供了QImage、QPixmap、QBitmap和QPicture四种图像操作类。QImage类主要用于...

QImage

支持的图像格式: BMP ,GIF , JPG , JPEG, PNG, PBM, PGM, PPM, XBM, XPM //使用给定的大小和格式构造图像 QImage(const ...

qt之QImage

QImage::QImage()    构造一个空的QImage对象,此时返回的对象,如果调用isNULL 返回值为真 QImage::QImage(const QSize & size, Fo...

QImage的显示

因为想利用QT的gui在arm上显示的缘故,因此开始接触了QT。最近,用QT在弄一个显示图片的小程序。程序如下: #include #include "mainwindow.h" ...

QImage的浅拷贝与深拷贝

首先简单说说什么是浅拷贝和深拷贝:浅拷贝就比如像引用类型,而深拷贝就比如值类型,即浅拷贝是共用一块内存的,而深拷贝是复制一份内容。  我们再来看看QImage类的几个构造函数:// 浅拷贝 QImag...
  • FreeApe
  • FreeApe
  • 2016年09月21日 23:25
  • 2339

QImage与QPixmap完全解析

转载自http://www.civilnet.cn/bbs/browse.php?topicno=4691 用Qt程序在手机上显示一幅图片对编程人员来说是再基...

Qt的QImage类

QImage类提供了一个硬件无关的图像表示方法,该图像可以逐像素被访问和用于画图设备。 Qt提供了QImage、QPixmap、QBitmap和QPicture四种图像操作类。QImage类主要用于I...
  • C_arm
  • C_arm
  • 2011年08月09日 23:10
  • 7027

使用QImage进行高质量绘制(High-Quality Rendering with QImage)

分类: C++ GUI Programming with Qt 4 (59) 在进行绘图时,我们经常要面对速度和效率两者之间矛盾。在X11和MacOsX系统上,在QWidget和QPixmap绘图...
  • lin_cj
  • lin_cj
  • 2016年04月26日 19:43
  • 912

练习一 使用QImage显示RGB图像和灰度图像

QT的图像类有QImage,QPixmap,QBitmap,QPicture。 CMyWidget类头文件: #ifndef CMYWIDGET_H #define CMYWIDGET_H ...

QImage 图像格式小结

嗯,这个QImage的问题研究好久了,有段时间没用,忘了,已经被两次问到了,突然有点解释不清楚,我汗颜,觉得有必要重新总结下了,不然无颜对自己了。 图像的数据是以字节为单位保存的,每一行的字节数必须...
  • aizhaoyu
  • aizhaoyu
  • 2013年10月11日 09:53
  • 11619
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QImage对一般图像的处理
举报原因:
原因补充:

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