[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, [email protected]  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, [email protected]  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拷贝到输出目录下。
结果如图:

[QT]抄—影像显示实验_第1张图片

 

 


                            

你可能感兴趣的:(qt)