当前位置: 首页 > news >正文

[QT]抄—影像显示实验

QtCreator新建一个Qt Application,命名为ImageView

在项目文件夹下添加gdal库,统一放在ImageView\gdal目录下。

右键单击项目,选择添加库命令,添加gdal_i.lib和头文件路径,完成后可以再ImageView.pro文件中查看:

win32: LIBS += -L$$PWD/gdal/lib/ -lgdal_i

INCLUDEPATH += $$PWD/gdal/include
DEPENDPATH += $$PWD/gdal/include

Main中的代码:
 1 #include "mainwindow.h"
 2 #include <QApplication>
 3 #include <QtGui/QLabel>
 4 #include <QtCore>
 5 
 6 int main(int argc, char *argv[])
 7 {
 8     QApplication app(argc, argv);
 9 
10         QTextCodec *codec=QTextCodec::codecForName("GBK");
11         if(codec==NULL)
12             codec=QTextCodec::codecForLocale();
13 
14         QTextCodec::setCodecForLocale(codec);
15         QTextCodec::setCodecForTr(codec);
16         QTextCodec::setCodecForCStrings(codec);
17 
18         QTranslator translator( 0 );
19         translator.load( "qt_zh_CN.qm", "." );
20         app.installTranslator( &translator );
21 
22         QFont font;
23         font.setFamily(QString::fromUtf8("\345\256\213\344\275\223"));
24         font.setPointSize(9);
25         app.setFont(font);
26 
27         CImageDisplayDlg MainWindow;
28         app.setActiveWindow(&MainWindow);
29         MainWindow.show();
30 
31         QString myStylesheet = "QDialog,QMainWindow,QSplitter\
32                                {background-color: qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgb(193,219,255) stop:1 rgb(227,239,255));}\
33                                QMenuBar{background-color: rgb(193,219,255);}";
34         app.setStyleSheet(myStylesheet);
35 
36         return app.exec();
37 }
main
窗体头文件
 1 /***************************************************************************
 2 *
 3 * Time: 2012-05-28
 4 * Project: 遥感图像显示Demo
 5 * Purpose: 遥感图像显示Demo
 6 * Author:  李民录
 7 * Copyright (c) 2011, liminlu0314@163.com
 8 * Describe:遥感图像显示Demo
 9 *
10 ****************************************************************************/
11 #ifndef MAINWINDOW_H
12 #define MAINWINDOW_H
13 
14 #include "ui_MainWindow.h"
15 #include <string>
16 using namespace std;
17 
18 class GDALDataset;
19 
20 QT_BEGIN_NAMESPACE
21 class QCheckBox;
22 class QComboBox;
23 class QLabel;
24 class QSpinBox;
25 QT_END_NAMESPACE
26 
27 class CImageDisplayDlg :
28     public QDialog,
29     private Ui::ImageDisplayDlg
30 {
31     Q_OBJECT
32 
33 public:
34     CImageDisplayDlg(QWidget* parent = 0);
35     ~CImageDisplayDlg(void);
36 
37 private:
38     bool CheckInputData(const char* pszRaster, const char* pszVector, QString& strMsg);
39 
40     private slots:
41         void LoadInputRaster();
42         void soltApply();
43         void OnOK();
44 
45 private:
46     bool ShowRasterFile();
47     void ShowRaster();
48 private:
49     string m_strInputRaster;
50     GDALDataset *m_pDataset;
51     double m_dScale;
52     int m_iMinx;
53     int m_iMiny;
54     int m_iMaxx;
55     int m_iMaxy;
56 };
57 
58 #endif /*MAINWINDOW_H*/
CImageDisplayDlg.h

  窗体实现

  1 /***************************************************************************
  2 *
  3 * Time: 2012-05-28
  4 * Project: 遥感图像显示Demo
  5 * Purpose: 遥感图像显示Demo
  6 * Author:  李民录
  7 * Copyright (c) 2011, liminlu0314@163.com
  8 * Describe:遥感图像显示Demo
  9 *
 10 ****************************************************************************/
 11 #include "MainWindow.h"
 12 
 13 #include <QFileDialog>
 14 #include <QMessageBox>
 15 #include <QSettings>
 16 
 17 #include "gdal_priv.h"
 18 
 19 CImageDisplayDlg::CImageDisplayDlg(QWidget* parent)
 20 : QDialog( parent )
 21 {
 22     setupUi(this);
 23 
 24     QObject::connect(buttonBox, SIGNAL(accepted()), this, SLOT(OnOK()));
 25     QObject::connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
 26     QObject::connect(pushButtonInput, SIGNAL(clicked()), this, SLOT(LoadInputRaster()));
 27     QObject::connect(pushButtonApply, SIGNAL(clicked()), this, SLOT(soltApply()));
 28 
 29     labelView->clear();
 30     m_pDataset = NULL;
 31 }
 32 
 33 CImageDisplayDlg::~CImageDisplayDlg(void)
 34 {
 35     if(m_pDataset != NULL)
 36     {
 37         GDALClose((GDALDatasetH) m_pDataset);
 38         m_pDataset = NULL;
 39     }
 40 }
 41 
 42 bool CImageDisplayDlg::ShowRasterFile()
 43 {
 44     GDALAllRegister();
 45     m_pDataset = (GDALDataset*)GDALOpen(m_strInputRaster.c_str(), GA_ReadOnly);
 46     if (m_pDataset == NULL)
 47     {
 48         QMessageBox::information(this,tr("提示"),tr("指定的文件不能打开!"));
 49         return false;
 50     }
 51     //设置投影坐标范围
 52     int    dataWidth = m_pDataset->GetRasterXSize();
 53     int dataHeight = m_pDataset->GetRasterYSize();
 54 
 55     double padfTransform[6] = {0.0};
 56     m_pDataset->GetGeoTransform(padfTransform);
 57 
 58     //设置行列号范围
 59     spinStartCol->setRange(0, dataWidth-1);
 60     spinStartRow->setRange(0, dataHeight-1);
 61     spinEndCol->setRange(0, dataWidth-1);
 62     spinEndRow->setRange(0, dataHeight-1);
 63 
 64     spinStartCol->setValue(0);
 65     spinStartRow->setValue(0);
 66     spinEndCol->setValue(dataWidth-1);
 67     spinEndRow->setValue(dataHeight-1);
 68 
 69     ShowRaster();
 70     return true;
 71 }
 72 
 73 void CImageDisplayDlg::LoadInputRaster()
 74 {
 75     QFileDialog::Options options;
 76     QString selectedFilter;
 77     QString fileName = QFileDialog::getOpenFileName(this,
 78         tr("打开原始图像"),
 79         ".",
 80         tr("所有文件(*.*);;Erdas Image (*.img);;PCIDSK (*.pix);;GTiff (*.tif *.tiff);;ENVI (*.*)"),
 81         &selectedFilter,
 82         options);
 83 
 84     if (!fileName.isEmpty())
 85     {
 86         if(m_pDataset != NULL)
 87         {
 88             GDALClose((GDALDatasetH) m_pDataset);
 89             m_pDataset = NULL;
 90         }
 91 
 92         lineInput->setText(fileName);
 93         m_strInputRaster = QFile::encodeName( fileName ).constData();
 94 
 95         if(!ShowRasterFile())
 96         {
 97             lineInput->setText("");
 98             m_strInputRaster = "";
 99         }
100     }
101 }
102 
103 void CImageDisplayDlg::ShowRaster()
104 {
105     int iStartCol = spinStartCol->value();
106     int iStartRow = spinStartRow->value();
107 
108     int dataWidth = spinEndCol->value() - iStartCol;
109     int dataHeight = spinEndRow->value() - iStartRow;
110     int    dataBands =  m_pDataset->GetRasterCount();
111 
112     int    band_list[3] = {1,2,3};
113 
114     m_dScale = dataHeight > dataWidth ? dataHeight : dataWidth;
115     int iViewHeight = 541;
116     m_dScale = iViewHeight/m_dScale;
117 
118     int iSize = GDALGetDataTypeSize(GDT_Byte) / 8;
119     int iScaleWidth = static_cast<int>(dataWidth*m_dScale+0.5);
120     int iScaleHeight = static_cast<int>(dataHeight*m_dScale+0.5);
121 
122     iScaleWidth = (iScaleWidth*8+31)/32*4;
123 
124     unsigned char* pBuffer = new unsigned char[iScaleWidth*iScaleHeight*dataBands];
125     CPLErr err = m_pDataset->RasterIO(GF_Read, 0, 0, dataWidth, dataHeight, pBuffer, iScaleWidth, iScaleHeight,
126         GDT_Byte, dataBands, band_list, iSize*dataBands, iSize*iScaleWidth*dataBands, iSize);
127     unsigned char* pDataBuffer = NULL;
128     if (dataBands >=3 )
129     {
130         pDataBuffer = pBuffer;
131     }
132     else
133     {
134         pDataBuffer = new unsigned char[iScaleWidth*iScaleHeight*3];
135         for (int i=0; i<iScaleWidth*iScaleHeight*3; i++)
136             pDataBuffer[i] = pBuffer[i/3];
137 
138         delete []pBuffer;
139     }
140 
141     QImage QImg(pDataBuffer, iScaleWidth, iScaleHeight, QImage::Format_RGB888);
142     QPixmap pixmap = QPixmap::fromImage(QImg);
143     delete []pDataBuffer;
144 
145     labelView->setPixmap(pixmap);
146 }
147 
148 void CImageDisplayDlg::OnOK()
149 {
150     accept();
151 }
152 
153 void CImageDisplayDlg::soltApply()
154 {
155     ShowRaster();
156 }
实现文件

编译运行需要将GDAl所有的DLL拷贝到输出目录下。
结果如图:

 

 


相关文章:

  • AWE 2017逛展第一天,智能家居厂商逐步打破壁垒
  • C++学习记录贴
  • 常用文件/文件夹操作
  • DB2 NoSQL JSON资料索引
  • 阿里云将在欧洲建立数据中心,预计在伦敦或瑞典落地
  • hdu 4192(表达式求值)
  • linux误删文件恢复工具-extundelete
  • 最近一直忙于学习平面设计
  • 易宝典文章——怎样重新连接并恢复 Exchange Server 2013已删除的用户邮箱
  • 级数
  • 远程入侵原装乘用车(上)
  • MySQL 5.5.22 单机多实例配置实践
  • SPOJ 1812 Longest Common Substring II
  • 北大ACM题库习题分类与简介(转载)
  • js整理
  • Bootstrap JS插件Alert源码分析
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Koa2 之文件上传下载
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Object.assign方法不能实现深复制
  • oschina
  • Python进阶细节
  • QQ浏览器x5内核的兼容性问题
  • Sass 快速入门教程
  • webgl (原生)基础入门指南【一】
  • 测试如何在敏捷团队中工作?
  • 复习Javascript专题(四):js中的深浅拷贝
  • 给初学者:JavaScript 中数组操作注意点
  • 今年的LC3大会没了?
  • 数组的操作
  • 说说动画卡顿的解决方案
  • 我的面试准备过程--容器(更新中)
  • 携程小程序初体验
  • 写代码的正确姿势
  • 一文看透浏览器架构
  • 优化 Vue 项目编译文件大小
  • 运行时添加log4j2的appender
  • 转载:[译] 内容加速黑科技趣谈
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​flutter 代码混淆
  • #162 (Div. 2)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (附源码)计算机毕业设计ssm电影分享网站
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)Neo4j下载安装以及初次使用
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net core 6.0 升8.0
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net IOC框架入门之一 Unity
  • .net 调用php,php 调用.net com组件 --
  • ?.的用法
  • @RequestMapping 的作用是什么?
  • [20170728]oracle保留字.txt