QImage对一般图像的处理
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对一般图像的处理的更多相关文章
- QImage 图像格式小结
原地址:http://tracey2076.blog.51cto.com/1623739/539690 嗯,这个QImage的问题研究好久了,有段时间没用,忘了,已经被两次问到了,突然有点解释不清楚, ...
- (转) QImage总结
嗯,这个QImage的问题研究好久了,有段时间没用,忘了,已经被两次问到了,突然有点解释不清楚,我汗颜,觉得有必要重新总结下了,不然无颜对自己了. 图像的数据是以字节为单位保存的,每一行的字节数必须是 ...
- 基于qml创建最简单的图像处理程序(2)-使用c++&qml进行图像处理
<基于qml创建最简单的图像处理程序>系列课程及配套代码基于qml创建最简单的图像处理程序(1)-基于qml创建界面http://www.cnblogs.com/jsxyhelu/p/8 ...
- Qt QImage与OpenCV Mat转换
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51029382 应一个朋友的要求,整理总 ...
- QImage学习学习
QImage这个类之前用过,无外乎是加载一个图片文件显示出来,并没有做过多的研究,目前工作中用到了灰度图以及图片的像素操作,重新学习了下,记录记录. 一些基本操作方法 获取图像的首地址: const ...
- Imagelab-0-QT label显示 opencv 图像
Imagelab-0-QT label显示 opencv 图像 opencvc++qtimagelab 开始之前 这其实也是opencv 处理图像的系列, 只是想我们在进一步复杂化我们的代码之前, 每 ...
- [Qt2D绘图]-05绘图设备-QPixmap&&QBitmap&&QImage&&QPicture
这篇笔记记录的是QPainterDevice(绘图设备,可以理解为一个画板) 大纲: 绘图设备相关的类:QPixmap QBitmap QImage QPicture QPixmap ...
- 2048游戏_QT实现
#ifndef GAMEWIDGET_H #define GAMEWIDGET_H #include <QWidget> #include <QMouseEvent> #inc ...
- Qt 学习之路:绘制设备
绘图设备是继承QPainterDevice的类.QPaintDevice就是能够进行绘制的类,也就是说,QPainter可以在任何QPaintDevice的子类上进行绘制.现在,Qt 提供了若干这样的 ...
随机推荐
- 函数类型(Function Types):函数类型和其他类型一样
函数类型(Function Types) 每个函数都有种特定的函数类型,由函数的参数类型和返回类型组成. 例如: 这个例子中定义了两个简单的数学函数:addTwoInts 和 multiplyTwoI ...
- 类图(Rose) - Windows XP经典软件系列
版权声明:本文为xiaobin原创文章.未经博主同意不得转载. https://blog.csdn.net/xiaobin_HLJ80/article/details/24584625 ...
- luogu P2016 战略游戏
嘟嘟嘟 树形dp水题啦. 刚开始以为和[SDOI2006]保安站岗这道题一样,然后交上去WA了. 仔细想想还是有区别的,一个是能看到相邻点,一个是能看到相邻边.对于第一个,可以(u, v)两个点都不放 ...
- heatmap for arcgisjsapi
在arcgis for js api 环境下使用heatmap插件. 由于最新的heatmap没有提供 for arcgisjsapi 插件,懒得研究新版本代码,所以这里用的还是老版本的heatma ...
- byte转换字符串(string)+字符串转换byte
C# 中字符串string和字节数组byte[]的转换 //string转byte[]: byte[] byteArray = System.Text.Encoding.Default.GetByte ...
- Java 循环结构
Java 循环结构 - for, while 及 do...while 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. Java中有三种主要的循环结构: whi ...
- 管理Django1.9静态文件static
管理Django1.9静态文件static 网站通常需要增加图片.JavaScript.或者CSS等文件提供服务.在Django中,我们把这些文件称为“静态文件”(static files).Djan ...
- Oracle 体系结构四 逻辑和物理存储结构之间的关系
Oracle数据库从物理存储中完全抽象出逻辑存储.逻辑数据存储采用“段”的形式.段的类型有很多种:典型的段是“表”.这些段以物理形式存储在数据文件中.通过表空间将逻辑存储从物理存储中抽象出来.逻辑结构 ...
- c++string标准输入和getline()整行读入
1.使用标准IO操作读写string对象 我们都知道,使用标准iostream操作来读写int ,double等内置类型的值,同样,我们也可以使用IO操作来读写string对象. c++ code: ...
- Redis支持的五种数据类型
redis支持的五种数据类型: 1.string(字符串) 2.hash(哈希) Redis hash 是一个键值(key=>value)对集合. Redis hash是一个string类型的f ...