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

 

 


posted @ 2014-06-24 19:58  太一吾鱼水  阅读(779)  评论(0编辑  收藏  举报