遥感图像处理QT及C++笔记

来源:互联网 发布:java string.split 编辑:程序博客网 时间:2024/06/05 05:19

一.Qt的那些事儿

 

1.        QObject是所有类的基类,而QWidget是所有图形类的基类,继承了QObject和QPaintDevice。

2.        Qt Object Model,主要包括如下的东西
1.
信号和槽,connect函数
2.
良好的对象属性,如可查询和很好看,,,~~
 3.
有力的事件和事件过滤器
4.
国际化字符设计
5.
定时器为GUI的事件提供毫秒级的支持
6.
很优秀的对象树结构
7.
当对象销毁时指针自动设置为0
 8.a dynamic cast that works across library boundaries
,不知如何翻译

 

 

3.     Win32 applicationwin32 ConsoleApplication的区别

Win32 Application的入口函数为WinMaininclude<windows.h>,能够使用win32API函数。

Win32 Console Application的入口函数是main,不能使用win32API函数。

 

4.     函数重载与子类成员函数覆盖

函数重载是发生在同一个类里,特别注意:函数名和参数都相同,而返回类型不一样的,不能重载;

子类在继承父类时,对同一个函数进行重定义,称为函数覆盖,不是重载;

除了虚函数,普通函数不占堆栈去大小,对sizeof无效,而是放在代码区;

 

 

 

5.     错误之:把槽函数当普通函数声明了

例如:我想通过一个按钮来选取文件名,并用消息框显示出来,

建立了如下的信号槽

connect(ui.BtnGetFile,SIGNAL(clicked()),this, SLOT(GetFileName()));

槽函数定义如下:

voidStripeStatis::GetFileName()

{

    QStringfilename = QFileDialog::getOpenFileName(this,"test","D:");

    if (!filename.isEmpty())

    {

        QMessageBox::information(this,"filename",filename);

    }

}

 

但是,在申明这个函数去当作普通函数来申明了

准确的是应该在头文件中注明是槽函数,方法如下:

publicslots:

    void GetFileName();

 

6.     句柄可直接调用函数

ui.EdtFile->setText(filename);

目的:    讲Dialog窗口中LineEdit中的值改变成“filename”;

说明:    Ui是Dialog类对象,而LineEdit是ui的一个成员变量,这个变量的类型是QLineEdit,而QLineEdit就具有voidsetText(const QString&)函数可以改变QLineEdit对象的值。

Ui的定义:Ui::StripeStatisui;

7.        窗口之间参数传递

如要讲一个QLineEdit中的值传递个另一个QLineEdit,就可以在这个窗口类中定义个成员变量,来完成窗口内部个组件之间的参数传递;

下面的界面中,点击“统计开始”,获取到QLineEdit中的值,并用一个MessgeBox输出!

在窗口类的头文件中,创建一个成员变量“filename

private:

    QString filename;

 

 

connect(ui.BtnDo,SIGNAL(clicked()),this,SLOT(Do()));

 

voidStripeStatis::Do()

{

     QMessageBox::information(this,"filename",filename);

}

 

connect(ui.BtnGetFile,SIGNAL(clicked()),this,SLOT(GetFileName()));

 

voidStripeStatis::GetFileName()

{

     filename = QFileDialog::getOpenFileName(this,"test","D:");

     if (!filename.isEmpty())

     {

         ui.EdtFile->setText(filename);

     }

}

 

8.        QT中文识别设置

在QT中往往要用到中文,如果直接写中文,会产生乱码现象,但是,可以通过如下设置解决这个问题:

首先,在包含main函数的文件中包含#include <QTextCodec>头文件;

然后在main函数中输入如下代码;

    QTextCodec *codec= QTextCodec::codecForName("GB2312");

    QTextCodec::setCodecForLocale(codec);

    QTextCodec::setCodecForCStrings(codec);

    QTextCodec::setCodecForTr(codec);

 

如此便OK!

 

 

 

 

 

9.        QT图像显示

 

首先,在QTDesigner中创建一个Label 组件,

 

假设其句柄名称为”Label”,显示图像时,会用到。

然后,在你的某个响应函数中,输入如下代码:

    QStringfilename;

    filename=QFileDialog::getOpenFileName(this,tr("选择图像文件"),"D:",tr("Images(*.tif *.bnp *.jpg *.GIF)"));

    if (filename.isEmpty())

    {

        return;

    }

    else

    {

        QImage *img =new QImage;

        if (! (img->load(filename)))//装载图像

        {

            QMessageBox::information(this,tr("打开图像失败"),tr("打开图像失败!"));

            deleteimg;

            return;

        }

        ui.label->setPixmap(QPixmap::fromImage(*img));

    }

 

注意:别忘了包含头文件:

#include<QFileDialog>

#include<QMessageBox>

#include<QPixmap>

#include<QLabel>

#include<QImage>

 

上面的代码,虽然能够打开图像并且显示出来,但是如果图像尺寸与Label窗口尺寸不一致,图像将不能完全显示,这时,该如何是好?

这个问题可以用container中的ScrollArea控件来解决,

在Qt Designer中创建一个ScrollArea控件,假设句柄名为“scrollArea”,然后,将label控件装入ScrollArea控件即可!

 

        ui.scrollArea->setBackgroundRole(QPalette::Dark);

        ui.scrollArea->setWidget(ui.label[雨林木风1] );[雨林木风2] 

最好将上面的代码添加到构造函数中,即窗口创建时就进行上面的设置。

 

示例:

 

 

上述处理的大致流程:

QFileDialog获取图像文件名à创建QImage对象装载图像àQLabel的setPixmap函数显示图像,如果图像过大,可以采用Scroll Area控件装入QLabel部件,当图像超出了QLabel大小时,就会产生滑竿,通过滑竿,则全部图像可以被看见!

 

10.    采用QGridlayout对控件进行缩放

目的:scrollArea和label都随主窗口缩放而缩放!

在主界面的头文件中定义QGridlayout对象变量;

QGridLayoutmyLayout;

添加如下函数

 

voidZY3_RC::layoutFunc()

{

     ui.centralWidget->setLayout(&myLayout);

     myLayout.addWidget(ui.scrollArea,0,0);

     myLayout.addWidget(ui.label, 0,0);

}

并在构造函数中使用上面的布局函数。

ZY3_RC::ZY3_RC(QWidget*parent,Qt::WFlags flags)

     :QMainWindow(parent,flags)

{

     ui.setupUi(this);

 

     setupConnections();

     layoutFunc();

 

     ui.scrollArea->setBackgroundRole(QPalette::Dark);

     ui.scrollArea->setWidget(ui.label);

     //StripeStatis dlg;

}

易错点:

没有将QGridlayout对象注册到窗口中去;

ui.centralWidget->setLayout(&myLayout);

 

11.  Qt窗口图标设置

一种简单的方法是,在Qt Designer中选中主窗口,点击属性中的“windowIcon”,选择图标,保存运行即可!

 

12.  别把自定义函数放在“ui.setupUi(this);”之前

错误:

CRad::CRad(QWidget *parent)

     :QDialog(parent)

{

     setConnection();

     ui.setupUi(this);

    

     FileMod = "NoFile";

}

在用户自定义界面类的构造函数中,有一句“ui.setupUi(this);”是用于建立用户定义的界面,如果你还要在此构造函数中添加代码,千万注意别添加在此语句之前,否则,会不认!

 

13.  错把button的SIGNAL写成了activateds()

如果你把按钮的信号写成了activated(),你永远也启动不了按钮,这种隐蔽的错误一定要小心!

connect(ui.BtnExit,SIGNAL(activated()),this,SLOT(close()));

 

14.  建立登录框

首先,简历QdialogQt窗口类logindlg

其次,修改main函数

intmain(int argc, char *argv[])

{

     QApplication a(argc,argv);

ZY3_RCw;

     logindlg ms;

     if (ms.exec() ==QDialog::Accepted)

     {

         w.show();

         return a.exec();

     }

     else

     {

         return 0;

     }

}

同时在logindlg.cpp中增加信号槽函数

     在logindlg构造函数中增加连接,

connect(ui.loginBtn,SIGNAL(clicked()),this,SLOT(loginFunc()));

     connect(ui.exitBtn,SIGNAL(clicked()),this, SLOT(close()));

编写loginFunc槽函数:

voidlogindlg::loginFunc()

{

     if (ui.usrlineEdit->text().trimmed()==tr("ZY03")&&ui.pwdlineEdit->text()==tr("123456"))

        

         accept();

     else

     {

         QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes);

         //ui.usrlineEdit->clear();

         ui.pwdlineEdit->clear();

         ui.pwdlineEdit->setFocus();

     }

}

为了将密码显示成小圆点,可以在logindlg构造函数中增加如下代码:

ui.pwdlineEdit->setEchoMode(QLineEdit::Password);

 

效果:

 

15.  设置默认按钮

如14中的登录界面中,人们的习惯是输入密码后,直接按下“回车”键,即可登录,即需要将默认按钮设置成“登录”按钮上。

在界面的构造函数内,加上下面的代码即可!

ui.loginBtn->setDefault(TRUE);

 

16.  Fstream 无法打开中文路径下文件

问题:在使用fstream打开一个图像数据时,图像文件路径包含了中文字体,此时,图像会打开失败,

为了解决此问题,须将程序运行编码格式作转换,为了不影响整个工程的编码格式,可以在使用输入/输出流的地方,作编码格式转换;完成输入/输出后,再将工程的编码格式变换回去。如下例:

 

     setlocale(LC_ALL,"Chinese-simplified");// add qiaozh 20130529

     fstreamfin;

。。。。。

     setlocale(LC_ALL,"C");// addqiaozh 20130529

 

17.    如何实现中英文自动切换?

1)新建translation file

2)将translation file用qt linguist打开,并完成编辑

 

 

3)在工程中完成Iupdate,Irelease,在工程文件夹中生成 *.qm文件,

 

 

4)将*.qm加载进资源文件中去,

 

5)在main函数中完成加载

 

将上面的例子改成界面中选择中英文切换?

先建两个切换菜单

connect(ui.act_Language_zh,SIGNAL(activated()),this,SLOT(LangZhFunc()));

connect(ui.act_Language_en,SIGNAL(activated()),this,SLOT(LangEnFunc()));

其次,在其槽函数里,加入代码

voidZY3_RC::LangEnFunc()

{

    QTranslator *newTranlator= new QTranslator(qApp);

    /*zyTranslator->load(":/translations/zy3_rc_zh.qm");*/

    qApp->removeTranslator(zyTranslator);

    zyTranslator->deleteLater();

    zyTranslator = newTranlator;

    newTranlator->load(":/translations/zy3_rc_zh.qm");

    qApp->installTranslator(zyTranslator);

    retranslateUi();

}

 

voidZY3_RC::LangEnFunc()

{

    QTranslator*newTranlator = new QTranslator(qApp);

 

    /*zyTranslator->load(":/translations/zy3_rc_en.qm");*/

    qApp->removeTranslator(zyTranslator);

    zyTranslator->deleteLater();

    zyTranslator= newTranlator;

    newTranlator->load(":/translations/zy3_rc_en.qm");

    qApp->installTranslator(zyTranslator);

}

 

上面的处理只能将新弹出的窗口完成翻译,不能对主界面进行翻译。怎么办?

 

还应加上

….

newTranlator->load(":/translations/zy3_rc_zh.qm");

      qApp->installTranslator(zyTranslator);

      retranslateUi();

void ZY3_RC::retranslateUi()

{

    setWindowTitle(tr("ZY01_RC"));

    ui.menuFile->setTitle(tr("File"));

    ui.actOpen->setText(tr("Open"));

    ui.actionExit->setText(tr("Exit"));

   

    ui.menuCalibrate->setTitle(tr("CalibrationCoefficient"));

    ui.actMeanCal->setText(tr("LaboratoryRelative Coeff"));

    ui.actStripeStatis->setText(tr("On-orbitRelative Coeff"));

    ui.actJYDB->setText(tr("UniformFieldRelative Coeff"));

    ui.actAbCal->setText(tr("AbsoluteCoeff"));

 

    ui.menuRadiationCorr->setTitle(tr("RadiationCorrection"));

    ui.actRC->setText(tr("RC"));

 

    ui.menuRadiationSimul->setTitle(tr("RadiationSimulation"));

    ui.actRad->setText(tr("PupilRadiance"));

    ui.actDyn->setText(tr("DynamicRange Analysis"));

 

    ui.menu_2->setTitle(tr("Language"));

    ui.act_Language_zh->setText(tr("Chinese"));

    ui.act_Language_en->setText(tr("English"));

 

    ui.menu->setTitle(tr("Help"));

    ui.actSpecif->setText(tr("Specification"));

    ui.actAbout->setText(tr("About"));

   

}

 

加上头文件

#include<QTranslator>

#include<QCoreApplication>

 

 

常见问题:明明翻译了,却不能实现切换?

应该是没加载进来,把资源中的*.qm移除后,再重新加载进来。

 

18.    如何让按钮长度随字体长度自动改变?

加弹簧

 

 

 

 

 

 

 

 

 

 

 

 

 

 

二.VC知识点

1.   附常用快捷键:

快捷键 功能
CTRL + SHIFT + B
生成解决方案
CTRL + F7 生成编译
CTRL + O 打开文件
CTRL + SHIFT + O打开项目
CTRL + SHIFT + C显示类视图窗口
F4 显示属性窗口
SHIFT + F4显示项目属性窗口
CTRL + SHIFT + E显示资源视图
F12 转到定义
CTRL + F12转到声明
CTRL + ALT + J对象浏览
CTRL + ALT + F1帮助目录
CTRL + F1 动态帮助 
F1 帮助
SHIFT + F1当前窗口帮助
CTRL + ALT + F3帮助-搜索
SHIFT + ALT + ENTER全屏显示
CTRL + -向后定位
CTRL + SHIFT + -向前定位
CTRL + F4关闭文档窗口
CTRL + PAGE DOWN光标定位到窗口上方
CTRL + PAGE UP光标定位到窗口下方
CTRL + F6
CTRL + TAB下一个文档窗口
CTRL + SHIFT + F6
CTRL + SHIFT + TAB上一个文档窗口
ALT + F6下一个面板窗口
CTRL + K, CTRL + L取消remark
CTRL + K, CTRL + C注释选择的代码
CTRL + K, CTRL + U取消对选择代码的注释
CTRL + M, CTRL + O折叠代码定义
CTRL + M, CTRL + L展开代码定义
CTRL + DELETE删除至词尾
CTRL + BACKSPACE删除至词头
SHIFT + TAB取消制表符
CTRL + U转小写
CTRL + SHIFT + U转大写
CTRL + SHIFT + END选择至文档末尾
CTRL + SHIFT + HOME选择至文档末尾开始
SHIFT + END选择至行尾
SHIFT + HOME选择至行开始处
SHIFT + ALT + END垂直选择到最后尾
SHIFT + ALT + HOME垂直选择到最前面
CTRL + A全选
CTRL + W选择当前单词
CTRL + SHIFT + PAGE UP选择至本页前面
CTRL + SHIFT + PAGE DOWN选择至本页后面
CTRL + END文档定位到最后
CTRL + HOME文档定位到最前
CTRL + G转到…
CTRL + K, CTRL + P上一个标签
CTRL + K, CTRL + N下一个标签
ALT + F10调试-ApplyCodeChanges 
CTRL + ALT+ Break停止调试
CTRL + SHIFT + F9 取消所有断点
CTRL + F9允许中断
CTRL + SHIFT + F5调试-重新开始
F5运行调试
CTRL + F5运行不调试
F10跨过程序执行
F11单步逐句执行
CTRL + J列出成员 
CTRL + PAGE DOWN下一个视图
CTRL + B格式-粗体
CTRL + SHIFT + T格式-文字缩进 

调试快捷键

F6: 生成解决方案
Ctrl+F6:
生成当前项目
F7: 查看代码
Shift+F7: 查看窗体设计器
F5: 启动调试
Ctrl+F5: 开始执行(不调试)
Shift+F5: 停止调试
Ctrl+Shift+F5: 重启调试
F9: 切换断点
Ctrl+F9: 启用/停止断点
Ctrl+Shift+F9: 删除全部断点
F10: 逐过程
Ctrl+F10: 运行到光标处
F11: 逐语句
编辑快捷键

Shift+Alt+Enter: 切换全屏编辑
Ctrl+B,T / Ctrl+K,K:
切换书签开关
Ctrl+B,N / Ctrl+K,N: 移动到下一书签
Ctrl+B,P: 移动到上一书签
Ctrl+B,C: 清除全部标签
Ctrl+I: 渐进式搜索
Ctrl+Shift+I: 反向渐进式搜索
Ctrl+F: 查找
Ctrl+Shift+F: 在文件中查找
F3: 查找下一个
Shift+F3: 查找上一个
Ctrl+H: 替换
Ctrl+Shift+H: 在文件中替换
Alt+F12: 查找符号(列出所有查找结果)
Ctrl+Shift+V: 剪贴板循环
Ctrl+左右箭头键: 一次可以移动一个单词
Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。
Ctrl+Shift+L: 删除当前行
Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态
Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态
Ctrl+M,P: 停止大纲显示
Ctrl+E,S: 查看空白
Ctrl+E,W: 自动换行
Ctrl+G: 转到指定行
Shift+Alt+箭头键: 选择矩形文本
Alt+鼠标左按钮: 选择矩形文本
Ctrl+Shift+U: 全部变为大写
Ctrl+U: 全部变为小写

代码快捷键

Ctrl+J / Ctrl+K,L: 列出成员
Ctrl+Shift+
空格键 / Ctrl+K,P: 参数信息
Ctrl+K,I: 快速信息
Ctrl+E,C / Ctrl+K,C: 注释选定内容
Ctrl+E,U / Ctrl+K,U: 取消选定注释内容
Ctrl+K,M: 生成方法存根
Ctrl+K,X: 插入代码段
Ctrl+K,S: 插入外侧代码
F12: 转到所调用过程或变量的定义

窗口快捷键

Ctrl+W,W: 浏览器窗口
Ctrl+W,S:
解决方案管理器
Ctrl+W,C: 类视图
Ctrl+W,E: 错误列表
Ctrl+W,O: 输出视图
Ctrl+W,P: 属性窗口
Ctrl+W,T: 任务列表
Ctrl+W,X: 工具箱
Ctrl+W,B: 书签窗口
Ctrl+W,U: 文档大纲
Ctrl+D,B: 断点窗口
Ctrl+D,I: 即时窗口
Ctrl+Tab: 活动窗体切换
Ctrl+Shift+N: 新建项目
Ctrl+Shift+O: 打开项目
Ctrl+Shift+S: 全部保存
Shift+Alt+C: 新建类
Ctrl+Shift+A: 新建项


VS2005
的隐藏快捷键 
 
这里我将会把一些无意中发现的VS2005中没有明确指出的快捷键共享出来,并不是所有的快捷键,或者常见的一些快捷键。
1、Ctrl+Space直接完成类或函数(本来这个并不算隐藏的快捷键,但是因为中文输入法抢占这个快捷键,所以。。。,替代的快捷键是Alt+Right)
2、Shift+Delete整行删除,并且将这一行放到剪贴板(这时候不能选中一段内容)
3、Shift+Insert粘贴,有点匪夷所思,Ctrl+V就可以了,大概是为了和Shift+Delete对应吧
4、Ctrl+Up,Ctrl+Down滚动编辑器,但尽量不移动光标,光标保证在可见范围内
5、Ctrl+BackSpace,Ctrl+Delete整词删除,有的时候很有用
6、Ctrl+Left,Ctrl+Right按整词移动光标(不算隐藏,和前面几条加起来就是Ctrl光标控制套件了)
7、Alt+Shift+F10打开执行改名,实现接口和抽象类的小窗口(还可以用Ctrl+.,不过有的中文输入法用到这个)
8、Shift+F9调试是打开QuickWatch,内容是当前光标所在处的内容
9、F12转跳到定义,很有用的快捷键
10、Shift+F12查找所有引用
11、Ctrl+F10=F5,开始Debug
12、Ctrl+F6循环察看代码窗口,有点Ctrl+Tab的感觉
13、Ctrl+F3查找当前光标选中的内容,可以和F3配合使用
14、Ctrl+F2将焦点转移到类的下拉框上
15、Alt+F7=Ctrl+Tab
16、Alt+F11新开VS2005并编辑宏
17、Alt+F12查找=Ctrl+F

 

2.        local function definitions areillegal解决办法 

 

 

这个没有别的原因就是少了一个右大括号“}”,报错的个数和这个函数的位置有关,好像也和作用域有关,或者和它的使用频度有关,反正报错的个数不太一样,是主应用程序的一个函数少了一个“}”。解决的方法就是:如果函数的数量少就一个一个的用Ctrl+}来查,如果太多的话就的将最近改动过的来试,好像也没有什么好的方法。(一般报错的位置不是真正的出错位置,一般是报错位置的上一个函数)

 

3.        预编译头问题

程序中出现下面问题:

fatalerror C1010: unexpected end of file while looking for precompiled header. Didyou forget to add '#include "stdafx.h"' to your source?

 

解决方案:

右击“工程”,将“C/C++”à”PrecompiledHeader“中的预编译头,选择成不使用。

 

 

4.        注意栈的大小

在windows编程中往往遇到“Stack overflow”的错误,这是因为,在windows中栈的默认大小只有1M,如果你在程序为普通变量申请了太多的内存,就会出现这个问题。

 

 

5.        VS行号

 

6.        找不到MSVCR90D.dll

设置工程属性中,采用FAT32文件系统

 

 

 

7.        Stack overflow Error

 

projectproperty->Configuration Properties->Linker->System->Stack ReserveSize
改成10000000,就可以了,注意是70

 

8.        ZY03RC处理模块从Linux下转到Windows下,主要问题及解决方法

 

1)      成像时间与时间节点的长度缩短成10

由于Windows下atol()函数最大转换值的限制,将Linux下原先使用13位long数据进行时间节点比较,修改给10位long比较,相应的将成像时间只去前10位

strncpy(timestr,tmpstr, 10);

 tptime = atol(timestr);

并且,将”503.cfg”文件中各个时间节点的起点修改为10位

 

2)      NAD函数栈溢出错误

 

NAD运行时修改了栈大小,不然无法运行

将栈大小改为10000000(7个0)。

 

3)      读写修改

将Linux下对大图像的打开、读取及存储使用的open, read, write均修改成Windows下的_open, _read, _write。

Linux

fp_image= open( str_256b, O_RDWR);

lseek(fp_image,ii*LINES_PER_TIME*configParam.totalWidth*2+ configParam.totalWidth*j*2,SEEK_SET);

read(fp_image,tempbuffBefore,2*configParam.totalWidth);

close(fp_image);

 

Windows

long fp_image = _open(str_256b,_O_RDONLY|_O_BINARY);

long pos = _lseek(fp_image, 0L, SEEK_END );

 

_read(fp_image, buffer, 2*12000);

_close(fp_image);

_write(out,tmpBuff, singlewidth*sizeof(unsigned short));

 

4)      保存Raw图像乱码

直接使用Linux下的存储代码,出现莫名其妙的错误

Linux:

FILE*fp_after;

sprintf(str_256b,"%s/RC_img_band%d_after_nochongdieregion.raw",inputParam.cLocalWorkDir,band+1);

fp_after= fopen(str_256b,"wb");

unsignedshort  img_per_line[9216-196*2];

for(i=0;i<inputParam.lAP_TotalLine;i++)

       {

              for(j=0; j<8192; j++)

                     img_per_line[j] =img_raw_after[i*24576+j];

              for(j=8192+22; j<8192*2; j++)

                     img_per_line[j-22] =img_raw_after[i*24576+j];

              for(j=8192*2+22; j<8192*3; j++)

                     img_per_line[j-22*2] =img_raw_after[i*24576+j];

              fwrite(img_per_line,  2, 24576-22*2,  fp_after);

       }

//Be carefull ! 2013 03 04

fclose(fp_after);

 

Windows:

sprintf(str_256b,"%s/RC_img_band%d_after_nochongdieregion.raw",inputParam.cLocalWorkDir,band+1);

 

unsigned short img_per_line[9216-196*2];

char *Result_byte = new char[8824*2];

fstream outResult;

outResult.open(str_256b, ios::out|ios::binary|ios::trunc);

if (outResult.fail())

{

       cout<<"Can notopen nochongdieregion.raw\n";

       return -2;

}

 

for(i=0;i<inputParam.lAP_TotalLine;i++)

       {

              for(j=0; j<8192;j++)

                     img_per_line[j]= img_raw_after[i*24576+j];

              for(j=8192+22;j<8192*2; j++)

                     img_per_line[j-22]= img_raw_after[i*24576+j];

              for(j=8192*2+22;j<8192*3; j++)

                     img_per_line[j-22*2]= img_raw_after[i*24576+j];

              //fwrite(img_per_line, 2, 24576-22*2,  fp_after);

for (int k=0;k<8824; k++)

              {

                     Result_byte[2*k]= static_cast<char>(img_per_line[k]>>8);

                     Result_byte[2*k+1]= static_cast<char>(img_per_line[k]);

 

              }

              outResult.write(Result_byte,8824*2);

       }

outResult.close();

delete [] Result_byte;

 

 

 

 

三.其他知识

1.        GDAL的安装及使用

 

GDAL安装

1)下载gdal的安装文件,http://download.osgeo.org/gdal/gdal142.zip,解压到某目录下

,如C:\gdalsrc下。
这里我们假定VC6的安装在默认目录C:\ProgramFiles\Microsoft Visual Studio8下。
2)启动cmd,即打开控制台窗口。进入VC6的安装目录下,如cdC:\Program Files\Microsoft

VisualStudio8\VC\bin\,在此目录下有个文件VCVARS32.BAT,执行一下这个文件,然后重新回

C:\gdalsrc下。运行命令nmake /f makefile.vc。编译完成后,用记事本打开文件

C:\gdalsrc\nmake.opt,根据自己的情况修改GDAL_HOME=这一行,这个指的是最终GDAL的安装

目录,比如说我们安装在C:\GDAL,那么这一行就是GDAL_HOME = "C:\GDAL",在C:\gdalsrc下执

nmake /f makefile.vc install,然后是nmake/f makefile.vc devinstall,然后我们需要

的东西就安装到了C:\GDAL下。

 

错误解决:

C:\gdalsrc目录下搜索包含“#    definevsnprintf _vsnprintf”的头文件,并将其注释掉,重新从“nmake /f makefile.vc”开始运行…..


GDAL使用

初次使用visual studio对工具不熟悉,有些步骤可以配置的

1)在VS2005中新建win32控制台程序 testGDALconsole,(向导中附加选项不能选为空项目)将C:\GDAL\bin\gdal14.dll拷贝到testGDALconsole目录下的debug目录中。(否则运行时会提示找不到gdal14.dll


2)在工程的Libraryfiles中和Includefiles中分别添加GDALLIB文件目录和头文件目录,

这步我不会,就直接将gdal_priv.h拷贝到testGDALconsole.cpp所在目录下

3)添加一个文件gdal_i.lib。使用 #pragma comment(lib,"..\\lib\\gdal_i.lib")(这步没做)
4)程序文件

样本程序如下:

#include"stdafx.h"

#include"gdal_priv.h"

#include<iostream>

using namespace std;

int main(int argc,char* argv[])

{

      if(argc!=2)

      {

             return 0;

      }

      GDALDataset *poDataset;

   GDALAllRegister();

   poDataset = (GDALDataset *) GDALOpen( argv[1], GA_ReadOnly );

   if( poDataset != NULL )

    {

       cout<<"RasterXSize:"<<poDataset->GetRasterXSize()<<endl;

             cout<<"RasterYSize:"<<poDataset->GetRasterYSize()<<endl;

             cout<<"RasterCount:"<<poDataset->GetRasterCount()<<endl;

    }

      return 0;

}

调试:设置调试路径和输入图像名称

 

 

2.        Modtran使用说明

采用MODO对MODTRAN的输入文件tape5进行修改,

然后选择MoDO/bin下的已有模板

 

进入修改界面

 

另存后,修改为tape5,进行运行,结果保存在tape7.scn中

 

 

 

 

 

 

 


 [雨林木风1]在构造函数里完成

 [雨林木风2]直接放在构造函数里,会报内存出错,

放在layoutFunc()之后才没问题