李国春
RSD内部统一以BIP格式排列数据,并且文件格式(非TFS)数据倒放(North Down)。早期是为了和设备无关位图(DIB)一致节省一点处理时间。现在设备处理能力增强了这点时间已经无关紧要,但是这种数据排列方式还是延续了下来。通常这些内部结构不需要用户关心,RSD自动处理成习惯的数据和图像。
高分卫星遥感数据运营部门分发的1级或者2级TIFF格式数据内部多保存为BSQ格式。RSD在读取时自动转换成BIP格式。但是也有一些部门(软件)开始就将其保存为BIP,RSD读取时再进行转换反而成了BSQ,读出来正射后结果如图1(左),4个波段的数据变成了16个小块。
下面介绍一个函数将其纠正为正常显示方式,图1(右)。
图1
下面的函数是一个读TIFF数据到缓存的函数。
int TifReadData(STRING name,WORD* buffer,int interleave);
这个函数将name 指定的TIFF数据以BIP格式读入到数据缓存buffer中。第三个参数int interleave是文件中的数据排列格式。如果你知道TIFF文件是BSQ格式排列的,将这个参数指定为BSQ,则读出数据如图1(右)。
下面是转换一个TIFF格式数据的完整代码。如果你正射校正一个数据集后发现结果如图一(左),将这个正射结果保存为一个TIFF格式文件,再用下述代码处理。代码如下:
/
// 99脚本语言示例代码 —— TifReadData(name,buffer,BSQ),将用BIP(INTERLEAVE==PIX)格式数据按 BSQ格式读出
//
// 李国春 2022年 11月 6日
/
main()
{
STRING name = OpenFileDialog(TRUE,"*.tif;*.tiff");//打开一个tif文件
Print("开始打开 %s 文件,读BSQ格式的数据",name);
DWORD tc = GetTickCount();
STRING projstr;
double box[4]; //投影后的四角坐标,次序为:minN,minE,maxN,maxE
double quad[8]; //四角的经纬度,书写次序。
double pixsize;
int height,width,bands,datatype;
int b2 = TifInqGTiffInfo(name,projstr,box,quad,pixsize,height,width,bands,datatype); //读取 Geo TIFF 文件信息
//申请内存,读入TIFF数据///
WORD buffer[height][width][bands];
int e = TifReadData(name,buffer,BSQ);//最后一个参数进行 BSQ 转换。(读正常数据最后一个参数写 BIP,或者空着不写)
//根据 PAN 数据范围创建任务,向任务框架添加正射校正后的 PAN 和 MSS 数据
STRING misname = FileNameMain(name);
int misID = CreateMission2(misname,projstr,box,pixsize);//创建任务,但是不显示窗口!!!
FmShowFrameWindow(misID,TRUE);//显示主框架窗口
//转换后数据创建新层
int lyr = GdMakeBufferGridLayer(buffer,datatype,0,0,height,width,bands,BIP,0,32767,misname);//将栅格数据加载到任务框架
int lyrs = InqNumLayers();//任务中层数
//窗口刷新显示
FmUpdateFrameWindow(lyrs-1);//用最后一层数据刷新任务主窗口
double tm = (GetTickCount() - tc) / 1000.0;
Print("转换并创建RSD任务 %s 并合成图像用时 %f 秒。",name,tm);
Print("主程序结束");
return TRUE;
}
运行后得到图1右侧的结果。
或者选中一个BSQ的GRID层,使用图2的菜单命令也可以将BSQ格式的数据转换为RSD缺省的BIP格式。
图2