GDAL直接操纵内存中的影像数据的办法
来源:互联网 发布:数据库与管理信息系统 编辑:程序博客网 时间:2024/06/04 22:34
没有一个简单现成的函数可以做到这个,Frank Warmerdam提示了一种办法,使用“内存文件系统”,但不是通常linux下的那种内存文件系统,而是GDAL自定义的。
首先需要安装一个内存文件处理器
这个特殊的文件处理器可以将一段内存块作为文件处理,这些文件位于"/vsimem/" 目录下(不用找了,在shell下是看不到的),也就是说该目录下的所有文件都被GDAL的内存文件处理器处理。不过目前还不支持目录操作,所以vsimem目录是平的。另外不同的进程有各自的/vsimem/目录,而同一进程下的所有线程共享同一/vsimem/目录。
可以用那些VSI*L函数创建和销毁内存里的数据,就像是操作文件一样。还有些方法可以高效的创建内存文件:不必拷贝原始的数据,这样同样的数据就不会重复出现在多个地方了;可以将某段内存块关联成“GDAL内存文件系统"中的一个文件。
A. 将内存中的一块二进制影像数据buffer读入到GDALDataset
然后对GDALDataset进行各种GDAL操作。一个例子如下:
1. 影像二进制数据在内存中的位置为pabyInData,数据的长度为nInDataLength,我们为它创建一个内存影像文件work.dat
C代码 收藏代码
VSIFCloseL( VSIFileFromMemBuffer( "/vsimem/work.dat", pabyInData,
nInDataLength, FALSE ) );
2. 打开这个内存影像文件,得到一个GDALDataset
C代码 收藏代码
GDALDatasetH hDS = GDALOpen( "/vsimem/work.dat", GA_ReadOnly );
用完后记得要调用下列函数删除内存中的这个文件:
VSIUnlink( "/vsimem/work.dat" );
B.将GDALDataset转换成某种格式的二进制影像数据流。
举一个GTiff例子,hDS为想输出为二进制数据的GDALDataset
1. 转换成目标数据格式的GDALDataset,这个GDALDataset是建立在“内存影像文件系统”上的
C代码 收藏代码
GDALDriverH hDriver = GDALGetDriverByName( "GTiff" );
GDALDatasetH hOutDS= GDALCreateCopy( hDriver, "/vsimem/out.tif", hDS, TRUE, NULL,
NULL, NULL );
hOutDS是一个指向内存影像文件系统上的指针,不用自己关闭。
2. 调用VSIGetMemFileBuffer函数从内存影像文件中读出二进制数据流
C代码 收藏代码
vsi_l_offset outDataLength; // 读出的二进制数据流的长度放在这个变量里
int bUnlinkAndSeize = TRUE;
GByte * binData = VSIGetMemFileBuffer("/vsimem/out.tif", &outDataLength, bUnlinkAndSeize);
binData为转换后的GTif格式的二进制影像数据,outDataLength为该影像数据的长度
bUnlinkAndSeize为TRUE的意思是,内存影像文件将会被自动删除,所以不必再调用VSIUnlink("/vsimem/out.tif")删除内存影像文件了(hOutDS也不用自己关闭);如果为FALSE,则会保留内存影像文件(hOutDS也要自己关闭)。
VSIGetMemFileBuffer函数分配的内存不要再用CPLFree函数释放:
C代码 收藏代码
CPLFree(binData);
否则可能出现double free错误,然后core dump。
VSI*函数内部会调用安装函数VSIInstallMemFileHandler();这个安装函数一般不需要直接调用,反复调用这个安装函数也没什么害处。
虽然还是原来的文件操作,但实际上是对内存直接操作的,只不过披上文件的外衣而已。
参考链接点这里:VSIInstallMemFileHandler。
首先需要安装一个内存文件处理器
这个特殊的文件处理器可以将一段内存块作为文件处理,这些文件位于"/vsimem/" 目录下(不用找了,在shell下是看不到的),也就是说该目录下的所有文件都被GDAL的内存文件处理器处理。不过目前还不支持目录操作,所以vsimem目录是平的。另外不同的进程有各自的/vsimem/目录,而同一进程下的所有线程共享同一/vsimem/目录。
可以用那些VSI*L函数创建和销毁内存里的数据,就像是操作文件一样。还有些方法可以高效的创建内存文件:不必拷贝原始的数据,这样同样的数据就不会重复出现在多个地方了;可以将某段内存块关联成“GDAL内存文件系统"中的一个文件。
A. 将内存中的一块二进制影像数据buffer读入到GDALDataset
然后对GDALDataset进行各种GDAL操作。一个例子如下:
1. 影像二进制数据在内存中的位置为pabyInData,数据的长度为nInDataLength,我们为它创建一个内存影像文件work.dat
C代码 收藏代码
VSIFCloseL( VSIFileFromMemBuffer( "/vsimem/work.dat", pabyInData,
nInDataLength, FALSE ) );
2. 打开这个内存影像文件,得到一个GDALDataset
C代码 收藏代码
GDALDatasetH hDS = GDALOpen( "/vsimem/work.dat", GA_ReadOnly );
用完后记得要调用下列函数删除内存中的这个文件:
VSIUnlink( "/vsimem/work.dat" );
B.将GDALDataset转换成某种格式的二进制影像数据流。
举一个GTiff例子,hDS为想输出为二进制数据的GDALDataset
1. 转换成目标数据格式的GDALDataset,这个GDALDataset是建立在“内存影像文件系统”上的
C代码 收藏代码
GDALDriverH hDriver = GDALGetDriverByName( "GTiff" );
GDALDatasetH hOutDS= GDALCreateCopy( hDriver, "/vsimem/out.tif", hDS, TRUE, NULL,
NULL, NULL );
hOutDS是一个指向内存影像文件系统上的指针,不用自己关闭。
2. 调用VSIGetMemFileBuffer函数从内存影像文件中读出二进制数据流
C代码 收藏代码
vsi_l_offset outDataLength; // 读出的二进制数据流的长度放在这个变量里
int bUnlinkAndSeize = TRUE;
GByte * binData = VSIGetMemFileBuffer("/vsimem/out.tif", &outDataLength, bUnlinkAndSeize);
binData为转换后的GTif格式的二进制影像数据,outDataLength为该影像数据的长度
bUnlinkAndSeize为TRUE的意思是,内存影像文件将会被自动删除,所以不必再调用VSIUnlink("/vsimem/out.tif")删除内存影像文件了(hOutDS也不用自己关闭);如果为FALSE,则会保留内存影像文件(hOutDS也要自己关闭)。
VSIGetMemFileBuffer函数分配的内存不要再用CPLFree函数释放:
C代码 收藏代码
CPLFree(binData);
否则可能出现double free错误,然后core dump。
VSI*函数内部会调用安装函数VSIInstallMemFileHandler();这个安装函数一般不需要直接调用,反复调用这个安装函数也没什么害处。
虽然还是原来的文件操作,但实际上是对内存直接操作的,只不过披上文件的外衣而已。
参考链接点这里:VSIInstallMemFileHandler。
0 0
- GDAL直接操纵内存中的影像数据的办法
- GDAL直接操纵内存中的影像数据的办法
- 基于GDAL的栅格数据/遥感影像IO (非分块)
- CImage对像素内存的直接操纵(转)
- gdal 生成影像的统计信息(ComputeStatistics)
- 利用GDAL实现影像的几何校正
- 使用GDAL工具对卫星数据进行影像配准
- 使用GDAL读取影像
- 使用GDAL读取影像
- GDAL影像重采样
- GDAL输出影像
- GDAL影像合并
- GDAL影像投影转换
- GDAL输出影像
- GDAL影像重采样
- GDAL读取MODIS影像
- 用GDAL对影像重采样的一些要点
- 基于GDAL的遥感影像显示(C#版)
- Unity3d大会的部分总结
- 21_C# 实现VMS客户端——控件_CheckBoxX
- C#_02_变量
- tim trgo 的使用方法
- Java集合类——Collection接口(传智播客毕老师视频讲解)
- GDAL直接操纵内存中的影像数据的办法
- 黑马程序员_16可变参数
- iOS软键盘遮挡元素时得处理办法
- 统计某个目录(含子目录)下所有java源文件中实际代码行数
- 福布斯:Hadoop——你不得不了解的大数据工具
- Encountered 1 errors during the transfer
- FAT文件系统解析(一) 引导扇区、FAT表及根目录区分析
- Unity3d中使用Profiler看到的一项"WaitForTargetFPS"费资源过高的原因
- 快速打开我的电脑属性