`
cryolite
  • 浏览: 581450 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

GDAL直接操纵内存中的影像数据的办法

    博客分类:
  • GDAL
阅读更多
没有一个简单现成的函数可以做到这个,Frank Warmerdam提示了一种办法,使用“内存文件系统”,但不是通常linux下的那种内存文件系统,而是GDAL自定义的。

首先需要安装一个内存文件处理器
这个特殊的文件处理器可以将一段内存块作为文件处理,这些文件位于"/vsimem/" 目录下(不用找了,在shell下是看不到的),也就是说该目录下的所有文件都被GDAL的内存文件处理器处理。不过目前还不支持目录操作,所以vsimem目录是平的。另外不同的进程有各自的/vsimem/目录,而同一进程下的所有线程共享同一/vsimem/目录。

可以用那些VSI*L函数创建和销毁内存里的数据,就像是操作文件一样。还有些方法可以高效的创建内存文件:不必拷贝原始的数据,这样同样的数据就不会重复出现在多个地方了;可以将某段内存块关联成“GDAL内存文件系统"中的一个文件。


A. 将内存中的一块二进制影像数据buffer读入到GDALDataset

然后对GDALDataset进行各种GDAL操作。一个例子如下:

1. 影像二进制数据在内存中的位置为pabyInData,数据的长度为nInDataLength,我们为它创建一个内存影像文件work.dat
VSIFCloseL( VSIFileFromMemBuffer( "/vsimem/work.dat", pabyInData,
                                       nInDataLength, FALSE ) );

2. 打开这个内存影像文件,得到一个GDALDataset
GDALDatasetH hDS = GDALOpen( "/vsimem/work.dat", GA_ReadOnly );


用完后记得要调用下列函数删除内存中的这个文件:
VSIUnlink( "/vsimem/work.dat" );


B.将GDALDataset转换成某种格式的二进制影像数据流。

举一个GTiff例子,hDS为想输出为二进制数据的GDALDataset
1. 转换成目标数据格式的GDALDataset,这个GDALDataset是建立在“内存影像文件系统”上的
 GDALDriverH hDriver = GDALGetDriverByName( "GTiff" );
 GDALDatasetH hOutDS= GDALCreateCopy( hDriver, "/vsimem/out.tif", hDS, TRUE, NULL, 
                              NULL, NULL );

hOutDS是一个指向内存影像文件系统上的指针,不用自己关闭。

2. 调用VSIGetMemFileBuffer函数从内存影像文件中读出二进制数据流
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函数释放:
CPLFree(binData);

否则可能出现double free错误,然后core dump。

VSI*函数内部会调用安装函数VSIInstallMemFileHandler();这个安装函数一般不需要直接调用,反复调用这个安装函数也没什么害处。

虽然还是原来的文件操作,但实际上是对内存直接操作的,只不过披上文件的外衣而已。
参考链接点这里:VSIInstallMemFileHandler
分享到:
评论

相关推荐

    GDAL读取影像数据

    GDAL 读取影像数据 GDAL(Geospatial Data Abstraction Library)是一种开源的栅格图像库,能够读取和处理多种格式的遥感数据,包括 Erdas Img、GeoTIFF 等格式。下面将详细介绍 GDAL 的读取影像数据功能。 GDAL ...

    基于多线程和gdal类库的影像读写

    在IT领域,尤其是在地理信息系统(GIS)开发中,"基于多线程和gdal类库的影像读写"是一个关键的技术点。GDAL(Geospatial Data Abstraction Library)是一个强大的开源库,用于处理多种遥感和地图数据格式,包括TIFF...

    gdal裁剪tif_tif遥感图像_GDAL裁剪_遥感影像_GDAL_gdal批量裁剪_

    遥感影像通常包含大面积的地理区域,通过GDAL裁剪可以聚焦到特定区域,减少数据大小,提高处理效率。此外,裁剪还能用于提取特定地理特征,如城市、森林、河流等。 7. **最佳实践** 在进行批量裁剪时,应确保所有...

    利用gdal批量提取遥感影像波段_单波段提取_gdal提取波段_利用gdal批量提取遥感波段中的单波段_遥感影像_GDAL_

    在遥感影像处理中,GDAL(Geospatial Data Abstraction Library)是一个强大的开源库,用于处理各种地理空间数据,包括栅格数据如遥感影像。本教程将深入讲解如何利用GDAL批量提取遥感影像的单个波段,这对于数据...

    基于GDAL实现多shp多影像的栅格数据批量裁剪

    因为遥感影像大部分都是栅格数据,所以GDAL库非常适合处理遥感影像、如光谱指数计算、波段合成、批量下载等。 本资源使用Python的GDAL库,实现一个或多个矢量文件,批量对一个或多个栅格数据进行裁剪,大大减少了...

    基于GDAL实现遥感影像的NDVI计算

    因为遥感影像大部分都是栅格数据,所以GDAL库非常适合处理遥感影像、如光谱指数计算、波段合成、批量下载等。 本资源使用Python的GDAL库,实现遥感影像的NDVI计算,可以通过加入遍历代码实现多张影像数据的光谱指数...

    gdal库修改影像波段

    在本场景中,"gdal库修改影像波段"指的是利用GDAL库的功能来调整多光谱影像的波段数量。 在遥感影像中,波段通常代表不同的光谱信息,例如可见光、近红外等。每个波段都包含了特定波长范围内的光信息,对于分析地表...

    C++ /GDAL 影像金字塔创建工具

    在压缩包中的"PyramidsDll"可能是一个动态链接库(DLL),它是C++编译的GDAL影像金字塔创建功能的实现,提供给开发者直接调用,简化了开发流程,使创建影像金字塔变得更加便捷。 总之,C++和GDAL的结合是实现高效...

    C++搭建框架,利用OpenGL、GDAL、Qt进行分块显示遥感影像

    在本文中,我们将深入探讨如何使用C++搭建一个框架,结合OpenGL、GDAL和Qt库来实现遥感影像的分块显示。这个框架的核心目的是高效地处理和展示大量的遥感数据,尤其是对于大尺寸的影像文件,通过分块技术提高显示...

    gdal库读取影像和建立金字塔代码的代码

    根据提供的信息,我们可以总结出以下关于使用GDAL库读取影像和建立金字塔的相关知识点: ### 一、GDAL库简介 GDAL (Geospatial Data Abstraction Library) 是一个开源的用于读写空间参考系统(Spatial Reference ...

    RPCandGCP影像校正_GDAL二级纠正_forgottenam4_控制点校正_影像纠正_

    在这个项目中,GDAL被用作实现影像纠正的工具。 3. **二级纠正(Second Order Correction)**:二级纠正通常指的是比一级纠正更精确的几何校正过程,它考虑了更多的因素,如传感器的畸变、地球曲率等,以进一步提高...

    基于Python-GDAL的遥感影像镶嵌脚本

    在IT行业中,遥感影像处理是一项重要的任务,它涉及到地理信息系统(GIS)和地球观测数据的分析。Python作为一门强大的编程语言,结合GDAL库,为处理遥感影像提供了便捷而高效的方法。本文将深入探讨如何利用Python...

    利用GDAL打开并显示多种影像(含遥感影像)VC++源代码

    本程序利用GDAL打开诸如:bmp、tif、jpeg、img等格式图像,并在VC下利用GDI绘图进行显示。适合初学者进行学习。附:本程序自己亲手所编,编译运行是一定可以通过的。那些下了后不能运行的原因是你们VC的对gdal的设置...

    基于GDAL读写影像并做线性拉伸,调整影像亮度

    在GDAL中,我们可以利用C++ API来实现这一操作。 首先,我们需要包含必要的GDAL头文件,如`gdal_priv.h`,并确保已经正确配置了GDAL库。接着,我们可以使用`GDALOpen()`函数打开影像文件,获取`GDALDataset`对象,...

    基于Python的GDAL高分变率遥感影像配准算法

    (1)基于SIFT与Ransac算法完成两景高分辨率遥感影像...(3)因数据上传限制,data文件夹里有两个高分二号融合影像(0.8米)的样例数据供大家参考学习。 (4)main.py为主函数,设置两期影像的路径和输出位置运行即可。

    C#下用GDAL对多景单幅影像进行图层叠加操作

    内含所有源代码,对于利用GDAL进行多幅影像进行图层叠加的小伙伴会有参考的,可能会有不足,但是代码是自己花了多半天弄出来的(VS2010 ),需要的朋友拿走把。效率挺高的,个人测试超过了ENVI的Layer Stacking效率...

    基于GDAL的CAD数据向Shp数据转换.pdf

    通过编写脚本或程序,可以使用GDAL库中的功能,直接将CAD文件读取并转换为Shp数据。 总结来说,CAD数据到Shp数据的转换对于GIS数据交换至关重要。利用GDAL进行转换不仅在技术上可行,在操作便利性和效率上也具有...

    C++ GDAL读取高分1号影像 实现LBP算法(源代码)VS2013

    通过C++ 用 GDAL来读取高分1号影像,影像类型为unsigned short ,只需安装GDAL库就可以实现读取影像,然后对影像进行LBP算法,最后输出到影像。格式为.tif。 实现LBP算法(源代码)

    使用GDAL查询tiff影像任意一点的高程

    本篇文章将详细讲解如何使用GDAL在C++环境中查询TIFF影像(一种常见的遥感图像格式)上任意一点的高程信息。 首先,我们需要了解GDAL的基本用法。GDAL库提供了一系列的API函数,用于与各类地理空间数据进行交互。在...

    GDAl+MFC切分影像

    若要查看源代码,当然要配置好gdal环境 2目前本程序只实现了裁剪单波段影像,打开影响时直接点击打开影像,选择单波段影像就可以打开了 3图像预处理菜单----影像分块就可以打开分块设置对话框 注意分块的方式有三种...

Global site tag (gtag.js) - Google Analytics