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 ) );
GDALDatasetH hDS = GDALOpen( "/vsimem/work.dat", GA_ReadOnly );
GDALDriverH hDriver = GDALGetDriverByName( "GTiff" ); GDALDatasetH hOutDS= GDALCreateCopy( hDriver, "/vsimem/out.tif", hDS, TRUE, NULL, NULL, NULL );
vsi_l_offset outDataLength; // 读出的二进制数据流的长度放在这个变量里int bUnlinkAndSeize = TRUE;GByte * binData = VSIGetMemFileBuffer("/vsimem/out.tif", &outDataLength, bUnlinkAndSeize);CPLFree(binData);