当前位置: 首页 > 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整理
  • 分享的文章《人生如棋》
  • 收藏网友的 源程序下载网
  • #Java异常处理
  • ECMAScript6(0):ES6简明参考手册
  • HTML5新特性总结
  • JAVA多线程机制解析-volatilesynchronized
  • MySQL几个简单SQL的优化
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • QQ浏览器x5内核的兼容性问题
  • Redis字符串类型内部编码剖析
  • SpingCloudBus整合RabbitMQ
  • Spring声明式事务管理之一:五大属性分析
  • STAR法则
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • VUE es6技巧写法(持续更新中~~~)
  • 微信小程序:实现悬浮返回和分享按钮
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • AI算硅基生命吗,为什么?
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • # Java NIO(一)FileChannel
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #QT(一种朴素的计算器实现方法)
  • ( 10 )MySQL中的外键
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (1)虚拟机的安装与使用,linux系统安装
  • (2015)JS ES6 必知的十个 特性
  • (十一)手动添加用户和文件的特殊权限
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)创业家杂志:UCWEB天使第一步
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net 使用ajax控件后如何调用前端脚本
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • @SpringBootApplication 包含的三个注解及其含义