[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 }
窗体头文件
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*/
窗体实现
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拷贝到输出目录下。
结果如图:
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。