使用动态链接库在IDL中实现ENVI格式遥感影像转(Big)GeoTIFF

之前用IDL写的ENVI格式转(Big)GeoTIFF,后来就觉得程序里面的思路,好像并没有用到IDL的优势,反而在更底层的C环境下可能来的更直接。所以做了一个类似于动态链接库的东西,可以在IDL中调用。
库函数包括了三个常用的(stdio.h主要用于文件流的I/O,string.h主要用于字符串操作,stdlib.h主要用于管理读写数据的内存空间),和一个制作动态链接需要的IDL头文件:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "idl_export.h"

然后是一个字节对齐问题的解决方法,所谓字节对齐,就是一个结构体里面如果有某个数据不是默认4字节的整数倍长度,编译器会将增加他的长度到默认4字节的整数倍长度,例如一个结构体里面包含了2字节的short类型数据和其他数据,那么这个2字节short数据后面会多出来2字节的随机数据。(这个问题还是请教了C语言老师才知道的)。所以解决方法就是加一行伪指令,让编译器的对齐字节为2字节。

#pragma pack (2)

关于数据类型,TIFF6中定义TIFF_short为无符号2字节,TIFF_long为无符号4字节,TIFF_long8为无符号8字节(BigTIFF引入)。所以就有个问题,在C语言中,有些数据类型在不同平台下的长度是不一样的,所以在定义TIFF的数据类型时,考虑了多平台下,长度均一致的数据类型来与TIFF的数据类型一一对应。

//TIFF data type
typedef unsigned short _short;  //2-byte, 16-bits
typedef unsigned int _long;  //4-byte, 32-bits
typedef unsigned long long _long8;  //8-byte, 64-bits

剩余函数太长了,就放在CSDN了,3积分,买它!
如果需要编译成动态链接库,还需要一些文件才能制作,详见C语言编写IDL动态可加载模块(DLM)入门。在IDL中的接口是sd_nv2tf, filename
不足:(因为本功能只是在白鸽中应用,所以)固定了IFD的内容,拓展新不好,还是只支持int/uint/float的数据类型,地理标签也固定了一部分,不支持BigEndian,只支持bip和bsq,ENVI格式影像无后缀(例如filename对应头文件为filename.hdr),好像还有只做了4波段和8波段。如果从根本上理解了TIFF6的组织结构,优化以上的不足会比较容易。
实测: GeoTIFF和BigGeoTIFF在bsq/bip+uint/int/float情况下都通过测试了。
效率: C语言动态链接库接口 > 纯IDL读写 > ENVI接口
另:bsq格式影像在ENVI中创建金字塔文件比bip慢得多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值