Qt + GDAL遥感图像基本浏览功能实现

        文中VS2010工程代码下载,使用需要自行配置Qt和GDAL路径。

    近期写了一个高光谱图像光谱曲线匹配的算法,想封装到软件当中方便观察效果,也便于做后期算法改进和实际应用,并且以后的算法可以直接集成上来。于是打算自己写一个基本的框架实现图像浏览的一些基本功能。在网上各种找,利用GDAL进行遥感图像显示的代码很多,但不是有问题就是写的不太清楚,不够简洁,并且大多基于MFC。经过几天的奋战,成功实现了利用Qt框架进行遥感图像显示的基本功能,于是分享出来,对自己是总结,并且希望对别人有所帮助。

开发环境:VS2010 Qt4.8.4GDAL 1.10

       说明:这里并没有QtGDAL,以及C++的一些基本的东西,这里只关注功能的实现做说明。如果对于QtGDAL有问题的,请参见其他资料。并不高深,高手绕道!

   重要说明:Qt发音叫做“Q特”,不是“Q替”,不要再读错了,官网有专门说明的!不要搞半天还说我发音有问题!!!  还有要写成Qt,不是QT,QT是QuickTime,不要混淆了。

         OK,先说说程序的功能:

  • 能够打开图像,并读取图像元数据信息;
  • 能够实现图像的正确显示,包括灰度图和RGB真彩色图的显示;
  • 支持图像的缩放,漫游;

计算机生成了可选文字: 困ImgTest口电口}~!画冲口州openViewoperationWindowHelplmageCloseZoomoutZoomInFitWindowNorm以Size人bout日X日XENVIBand3Band41DescriptionMetaInforDataTypeX引zeySizeBandCountprojectionoriginpixelSizeENVI.hdrLab…Ulnt1653505376pROJCS[.UTM…660221,3.696二8.04627·8.0L二…___

 

计算机生成了可选文字: 困ImgTest}~4县卜口叫openViewoperationWindowHelplmageCloseZoomoutZoomInFitWindowNorm以Size人bout日X1DescriptionMetaInforDataTypeX引zeySizeBandCountprojectionoriginpixelSizeENVIBand3Band4ENVI.hdrLab…Ulnt1653505376pROJCS[.UTM…660221,3.696二8.04627·8.0L二….

    功能非常简单基础,但是这当中很多细节是需要认真参透的。下面开始逐一进行讲解。(PSUI的设计就不讲了。)


        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 )是读图函数,通过

  • 22
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值