首页 > 代码库 > [QT]抄—影像显示实验
[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_H12 #define MAINWINDOW_H13 14 #include "ui_MainWindow.h"15 #include <string>16 using namespace std;17 18 class GDALDataset;19 20 QT_BEGIN_NAMESPACE21 class QCheckBox;22 class QComboBox;23 class QLabel;24 class QSpinBox;25 QT_END_NAMESPACE26 27 class CImageDisplayDlg :28 public QDialog,29 private Ui::ImageDisplayDlg30 {31 Q_OBJECT32 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 else133 {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拷贝到输出目录下。
结果如图:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。