遥感图像处理QT及C++笔记
2013-06-16 21:09
344 查看
一.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 application
与win32 ConsoleApplication的区别
Win32 Application的入口函数为WinMain,include<windows.h>,能够使用win32API函数。
Win32 Console Application的入口函数是main,不能使用win32API函数。
4. 函数重载与子类成员函数覆盖
函数重载是发生在同一个类里,特别注意:函数名和参数都相同,而返回类型不一样的,不能重载;
子类在继承父类时,对同一个函数进行重定义,称为函数覆盖,不是重载;
除了虚函数,普通函数不占堆栈去大小,对sizeof无效,而是放在代码区;
5. 错误之:把槽函数当普通函数声明了
例如:我想通过一个按钮来选取文件名,并用消息框显示出来,
建立了如下的信号槽
connect(ui.BtnGetFile,
SIGNAL(clicked()),
this, SLOT(GetFileName()));
槽函数定义如下:
void
StripeStatis::GetFileName()
{
QString
filename = QFileDialog::getOpenFileName(this,"test",
"D:");
if (!filename.isEmpty())
{
QMessageBox::information(this,
"filename",filename);
}
}
但是,在申明这个函数去当作普通函数来申明了
准确的是应该在头文件中注明是槽函数,方法如下:
public
slots:
void
GetFileName();
6. 句柄可直接调用函数
ui.EdtFile->setText(filename);
目的: 讲Dialog窗口中LineEdit中的值改变成“filename”;
说明: Ui是Dialog类对象,而LineEdit是ui的一个成员变量,这个变量的类型是QLineEdit,而QLineEdit就具有void
setText(const
QString&)函数可以改变QLineEdit对象的值。
Ui的定义:Ui::StripeStatis
ui;
7. 窗口之间参数传递
如要讲一个QLineEdit中的值传递个另一个QLineEdit,就可以在这个窗口类中定义个成员变量,来完成窗口内部个组件之间的参数传递;
下面的界面中,点击“统计开始”,获取到QLineEdit中的值,并用一个MessgeBox输出!
在窗口类的头文件中,创建一个成员变量“filename”
private:
QString filename;
connect(ui.BtnDo,
SIGNAL(clicked()),this,
SLOT(Do()));
void
StripeStatis::Do()
{
QMessageBox::information(this,
"filename",filename);
}
connect(ui.BtnGetFile,
SIGNAL(clicked()),this,
SLOT(GetFileName()));
void
StripeStatis::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”,显示图像时,会用到。
然后,在你的某个响应函数中,输入如下代码:
QString
filename;
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对象变量;
QGridLayout
myLayout;
添加如下函数
void
ZY3_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函数
int
main(int
argc, char *argv[])
{
QApplication a(argc,
argv);
ZY3_RC
w;
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槽函数:
void
logindlg::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
fstream
fin;
。。。。。
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,就可以了,注意是7个0哦
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中分别添加GDAL的LIB文件目录和头文件目录,
这步我不会,就直接将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()之后才没问题
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 application
与win32 ConsoleApplication的区别
Win32 Application的入口函数为WinMain,include<windows.h>,能够使用win32API函数。
Win32 Console Application的入口函数是main,不能使用win32API函数。
4. 函数重载与子类成员函数覆盖
函数重载是发生在同一个类里,特别注意:函数名和参数都相同,而返回类型不一样的,不能重载;
子类在继承父类时,对同一个函数进行重定义,称为函数覆盖,不是重载;
除了虚函数,普通函数不占堆栈去大小,对sizeof无效,而是放在代码区;
5. 错误之:把槽函数当普通函数声明了
例如:我想通过一个按钮来选取文件名,并用消息框显示出来,
建立了如下的信号槽
connect(ui.BtnGetFile,
SIGNAL(clicked()),
this, SLOT(GetFileName()));
槽函数定义如下:
void
StripeStatis::GetFileName()
{
QString
filename = QFileDialog::getOpenFileName(this,"test",
"D:");
if (!filename.isEmpty())
{
QMessageBox::information(this,
"filename",filename);
}
}
但是,在申明这个函数去当作普通函数来申明了
准确的是应该在头文件中注明是槽函数,方法如下:
public
slots:
void
GetFileName();
6. 句柄可直接调用函数
ui.EdtFile->setText(filename);
目的: 讲Dialog窗口中LineEdit中的值改变成“filename”;
说明: Ui是Dialog类对象,而LineEdit是ui的一个成员变量,这个变量的类型是QLineEdit,而QLineEdit就具有void
setText(const
QString&)函数可以改变QLineEdit对象的值。
Ui的定义:Ui::StripeStatis
ui;
7. 窗口之间参数传递
如要讲一个QLineEdit中的值传递个另一个QLineEdit,就可以在这个窗口类中定义个成员变量,来完成窗口内部个组件之间的参数传递;
下面的界面中,点击“统计开始”,获取到QLineEdit中的值,并用一个MessgeBox输出!
在窗口类的头文件中,创建一个成员变量“filename”
private:
QString filename;
connect(ui.BtnDo,
SIGNAL(clicked()),this,
SLOT(Do()));
void
StripeStatis::Do()
{
QMessageBox::information(this,
"filename",filename);
}
connect(ui.BtnGetFile,
SIGNAL(clicked()),this,
SLOT(GetFileName()));
void
StripeStatis::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”,显示图像时,会用到。
然后,在你的某个响应函数中,输入如下代码:
QString
filename;
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对象变量;
QGridLayout
myLayout;
添加如下函数
void
ZY3_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函数
int
main(int
argc, char *argv[])
{
QApplication a(argc,
argv);
ZY3_RC
w;
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槽函数:
void
logindlg::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
fstream
fin;
。。。。。
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,就可以了,注意是7个0哦
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中分别添加GDAL的LIB文件目录和头文件目录,
这步我不会,就直接将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()之后才没问题
相关文章推荐
- QML笔记整理——在Qt/C++应用中使用QML
- QML与c++交互学习笔记(八) qt c++直接调用QML中的函数, 直接设置属性
- 《C++ GUI Qt 4 编程》 笔记(四)
- QML与c++交互学习笔记(八) qt c++直接调用QML中的函数, 直接设置属性
- 《C++ GUI Qt 4 编程》 笔记(一)
- 《C++ GUI Qt 4 编程》 笔记(五)
- QML与c++交互学习笔记(八) qt c++直接调用QML中的函数, 直接设置属性
- 《C++ GUI Qt 4 编程》 笔记(六)
- C++学习笔记之QT/VS编译Qrencode
- 《C++ GUI Qt 4 编程》 笔记(七)
- QML与c++交互学习笔记(八) qt c++直接调用QML中的函数, 直接设置属性
- C++学习笔记之QT/MFC生成二维码
- C++学习笔记(四)QT的简单使用 —参考阿发你好
- 《C++ GUI Qt 4 编程》 笔记(三)
- C++学习笔记之I/O库
- C++复习笔记(1)类的继承
- C++学习笔记(1)
- C++面试笔记--树
- C++学习笔记--函数参数扩展和占位参数