[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]抄—影像显示实验

时间: 2024-10-09 13:21:37

[QT]抄—影像显示实验的相关文章

遥感影像显示相关的技术总结

遥感影像显示相关的技术总结 前言 从事遥感影像和图像处理有一段时间了,今天就把遥感影像显示相关的技术和大家分享一下. 平常我们用的GIS软件或者说遥感软件都能讲遥感影像的数据显示在屏幕上,并且有些显示效果还不错,其中ENVI的显示效果是业界做得比较好的,尤其是ENVI5.0之后的大视图,能够根据真彩色的波段自动选择波段进行显示.遥感影像显示其实就是图像显示,和我们生活中常见的图像显示没有太大区别,基本上原理是一样的,但也有自己独特的地方,之后会讲到.首先,我们来看看图像显示的基本过程,即图像是怎

Qt开发中文显示乱码

Qt开发中文显示乱码 来源 https://www.jianshu.com/p/ed269df8104d 参考 https://blog.csdn.net/J_H_C/article/details/93882284 为什么会出现乱码 首先,我们需要有的概念是乱码的问题是由编码和解码方式引起的.涉及到编码方式的地方有3个: 源码字符集 执行字符集 运行环境字符集 源码字符集确切的说是编译器认为源码文件的编码方式,执行字符集是可执行程序采用的编码方式,而运行环境字符集则是环境支持的编码方式.编译程

关于VGA显示实验的问题

今天做了一个关于VGA的显示实验,但是由于产生的25M时钟不正确所以一直没有图像产生.刚开始的程序如下 虽然仿真的时候出现了时序,但是在下载到硬件的时候不正确. 后来改成 结果就正确了. 另外之前关于分频时用边沿触发和用电平触发的结果是不一样的. 下面是VGA实验使用到了ADV7123在DE115平台进行的实验.640*480*25M水平同步信号和场同步信号可以 根据VGA的时序图进行计算. 顶层文件://THIS IS ABOUT VGA TEST 实验结果整个屏幕是红色 module VGA

QT使用tableWidget显示双排列表 并且选中用红框圈出来

如需转载请标明出处:http://blog.csdn.net/itas109 整个工程下载地址:http://download.csdn.net/detail/itas109/7607735 这里采用tableWidget显示双排列表 双排列表代码 QTableWidgetItem* item[50]; int Row; if (num%2 == 1) { Row = num/picColumn+1; } else { Row = num/picColumn; } int index;//表格坐

Qt支持中文显示

Qt支持中文显示<1>.在代码中添加以下代码QTextCodec* codec = QTextCodec::codecForLocale();if (codec != NULL){    QTextCodec::setCodecForLocale(codec);    QTextCodec::setCodecForCStrings(codec);    QTextCodec::setCodecForTr(codec);} <2>.在应用程序目录建立一个codecs文件夹,并将Qt对

关于Qt中 中文显示的解决办法

关于Qt中 中文显示的解决办法 在linux平台下,这样显示中文 QLabel *label = new QLabel; QTextCodec *codec = QTextCodec::codecForName("UTF-8"); label->setText(codec->toUnicode("<center><h1>你好</h1></center>"));  label->setWindowTit

基于VC++ Win32+CUDA+OpenGL组合与VC++ MFC SDI+CUDA+OpenGL组合两种方案的遥感影像显示:获得的重要结论!

1.基于VC++ Win32+CUDA+OpenGL组合的遥感影像显示 在该组合方案下,初始化时将OpenGL设置为下面两种方式,效果一样 //设置方式1 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA); //设置方式2 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 从遥感影像数据中提取出像素数据,可将其中的R.G.B三通道依次赋值给OpenGL的像素缓冲区对象 (PBO,Pixel Buffer Obje

QT 全屏显示子窗口

QT 中全屏显示子窗口的方法 QT 中窗口部件 QWidget 成员函数 showFullScreen();是用于将窗口部件全屏显示 但是他只对窗口模式的部件有用.子窗口的特征是 Qt::SubWindow不是独立的窗 口.因此对其调用 showFullScreen无效.通过对子窗口调用setWindowFlags Qt: :Dialog或 setWindowFlagsQt::Window将其设为窗口模式后即可 调用 showFullScreen();进行全屏显示了. 相对于子窗口的全屏显示方法

Qt学习笔记-嵌入式qt程序支持显示中文

移植后得qt程序在开发板上运行时无法显示中文. 拷贝windows中的字体也不行. 从网上找到方法. 添加以下代码:需要头文件  #include <QTextCodec> QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); //支持Tr中文 QText