文中VS2010工程代码下载,使用需要自行配置Qt和GDAL路径。
近期写了一个高光谱图像光谱曲线匹配的算法,想封装到软件当中方便观察效果,也便于做后期算法改进和实际应用,并且以后的算法可以直接集成上来。于是打算自己写一个基本的框架实现图像浏览的一些基本功能。在网上各种找,利用GDAL进行遥感图像显示的代码很多,但不是有问题就是写的不太清楚,不够简洁,并且大多基于MFC。经过几天的奋战,成功实现了利用Qt框架进行遥感图像显示的基本功能,于是分享出来,对自己是总结,并且希望对别人有所帮助。
开发环境:VS2010, Qt4.8.4,GDAL 1.10。
说明:这里并没有Qt和GDAL,以及C++的一些基本的东西,这里只关注功能的实现做说明。如果对于Qt和GDAL有问题的,请参见其他资料。并不高深,高手绕道!
重要说明:Qt发音叫做“Q特”,不是“Q替”,不要再读错了,官网有专门说明的!不要搞半天还说我发音有问题!!! 还有要写成Qt,不是QT,QT是QuickTime,不要混淆了。
OK,先说说程序的功能:
- 能够打开图像,并读取图像元数据信息;
- 能够实现图像的正确显示,包括灰度图和RGB真彩色图的显示;
- 支持图像的缩放,漫游;
功能非常简单基础,但是这当中很多细节是需要认真参透的。下面开始逐一进行讲解。(PS:UI的设计就不讲了。)
1.程序简单设计
其实这个程序的设计相对简单,除了显示图像的控件需要自定义,其他的都可以直接在Qt Designer里面拖放就行了。那就来说说图像显示控件吧。先看头文件:
//***********************************************************************
//Assembly : ImgTest
//Author : Jacory
//Created : 07-10-2014
//
// LastModified By : Jacory
// LastModified On : 07-10-2014
//***********************************************************************
//<copyright file="MapCanvas.h" company="">
// Copyright (c) . All rights reserved.
//</copyright>
//<summary>图像显示窗口类,负责图像的读取和显示等功能。</summary>
//***********************************************************************
#ifndefMAPCANVAS_H
#defineMAPCANVAS_H
#include<QtGui/QGraphicsView>
#include<QStandardItemModel>
#include<gdal_priv.h>
///<summary>
/// ClassMapCanvas.
///</summary>
classMapCanvas : public QGraphicsView
{
Q_OBJECT
public:
MapCanvas( QWidget *parent = 0 );
~MapCanvas();
void ReadImg( const QString imgPath );
void CloseCurrentImg();
/// <summary>
/// 返回图像元数据信息模型.
/// </summary>
///<returns>图像元数据信息模型.</returns>
QStandardItemModel* ImgMetaModel()
{
return imgMetaModel;
};
/// <summary>
/// 设置图像元数据信息模型
/// </summary>
/// <paramname="model">图像元数据信息模型.</param>
void SetMetaModel( QStandardItemModel*model )
{
this->imgMetaModel = model;
};
/// <summary>
/// 返回文件列表数据模型
/// </summary>
///<returns>文件列表数据模型.</returns>
QStandardItemModel* FileListModel()
{
return fileListModel;
};
/// <summary>
/// 设置fileListModel图像文件列表数据模型
/// </summary>
/// <paramname="model">文件列表数据模型.</param>
void SetFileListModel( QStandardItemModel*model )
{
this->fileListModel = model;
};
QSize sizeHint() const;
publicslots:
/// <summary>
/// 放大图像
/// </summary>
void ZoomIn()
{
ScaleImg( 1.2 );
};
/// <summary>
/// 缩小图像
/// </summary>
void ZoomOut()
{
ScaleImg( 0.8 );
};
protected:
void wheelEvent( QWheelEvent *event );
void mousePressEvent( QMouseEvent *event );
void mouseMoveEvent( QMouseEvent *event );
void mouseReleaseEvent( QMouseEvent *event);
private:
void ShowBand( GDALRasterBand* band );
void ShowImg( QList<GDALRasterBand*>*imgBand );
void ShowImgInfor( const QString filename);
void ShowFileList( const QString filename);
unsigned char* ImgSketch( float* buffer ,GDALRasterBand* currentBand, int size, double noValue );
/// <summary>
/// 图像缩放
/// </summary>
/// <paramname="factor">缩放因子</param>
void ScaleImg( double factor )
{
m_scaleFactor *= factor;
QMatrix matrix;
matrix.scale( m_scaleFactor,m_scaleFactor );
this->setMatrix( matrix );
};
/// <summary>
/// 图像元数据模型
/// </summary>
QStandardItemModel *imgMetaModel;
/// <summary>
/// 图像数据集
/// </summary>
GDALDataset *poDataset;
/// <summary>
/// 文件列表数据模型
/// </summary>
QStandardItemModel *fileListModel;
/// <summary>
/// 缩放系数
/// </summary>
float m_scaleFactor;
/// <summary>
/// 判断是否显示RGB彩色图像
/// </summary>
bool m_showColor;
/// <summary>
/// 上一个鼠标事件触发时鼠标的位置
/// </summary>
QPoint lastEventCursorPos;
};
#endif //MAPCANVAS_H
mapView类集成自QGraphicsView类。代码里面对于成员变量和inline函数我已经写了非常详细的注释了,这里再说明一下几个函数的功能。void ReadImg( const QStringimgPath )是读图函数,通过