博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从二进制数据流中构造GDAL可以读取的图像数据
阅读量:6320 次
发布时间:2019-06-22

本文共 1421 字,大约阅读时间需要 4 分钟。

在很多时候,我们的图像数据往往都不是文件方式存储在磁盘上,而是可能从网络或者数据库中获取的是二进制的图像数据流。最简单的方式和最容易想到的方式就是将这个文件流保存到磁盘上形成一个文件,然后再使用GDAL来打开进行处理。但是这样有一个不太好的地方就是需要生成一个磁盘的临时文件,而且在磁盘上折腾了一圈后会增加不必要的系统开销。

针对这个文件,GDAL库里面已经有现成的API来进行处理,下面就使用一个简单的例子来进行说明,代码如下:

GByte *GetStream(const char* pszFile, int &nSize){	FILE* pFile = fopen(pszFile, "rb");	fseek(pFile, 0, SEEK_END);	nSize = ftell(pFile);	fseek(pFile, 0, SEEK_SET);	GByte *pBuffer = new GByte[nSize];	fread(pBuffer, nSize, 1, pFile);	fclose(pFile);	return pBuffer;}int StreamTest(){	//为了测试,从一个文件中将全部的数据读取为二进制流	const char* pszFile = "F:\\Data\\Test.tif";	// 为了构造内存文件,必须有一个内存文件名称,以/vsimem/开头,后面的随便啥都行,	// 这里使用00000000这个来进行测试	string osMemFileName = "/vsimem/00000000";	// 写了一个函数,读取二进制数据,也可以从数据库中或者网络啥的获取图像的二进制流存储在pabyData中	int nDataSize = 0;	GByte* pabyData = GetStream(pszFile, nDataSize);	// 将二进制流构造到MEM文件中	VSIFCloseL(VSIFileFromMemBuffer( osMemFileName.c_str(), pabyData, nDataSize, FALSE));        GDALAllRegister();	// 使用GDALOpen打开构造好的MEM文件	GDALDatasetH hDS = GDALOpen(osMemFileName.c_str(), GA_ReadOnly);	if (hDS == NULL)	{		// 打开失败,将内存文件进行释放		VSIUnlink(osMemFileName.c_str());		return FALSE;	}	// 下面就按照正常的图像处理流程处理即可	printf("width = %d\nheight = %d\n", GDALGetRasterXSize(hDS), GDALGetRasterYSize(hDS));	// 关闭图像	GDALClose(hDS);	// 处理结束后,将内存文件进行释放	VSIUnlink(osMemFileName.c_str());	delete [] pabyData;	return TRUE;}
上面GetStream函数用来读取一个数据流。详细的注视都在代码里面了。

转载于:https://www.cnblogs.com/xiaowangba/p/6313917.html

你可能感兴趣的文章
java基础(五)-----关键字static
查看>>
什么是PLI?
查看>>
创业7大原则
查看>>
Unity打开外部程序exe/Bat文件方案
查看>>
Liunx vi/vim 2
查看>>
Chrome快捷键
查看>>
使用ToolHelperAPI枚举OS中所有的线程和进程
查看>>
解决SQL Server本地Windows身份无法登录
查看>>
田园婚礼:早春婚礼洋溢阳光气息【奥帆婚礼顾问】
查看>>
[UIKit学习]04.关于HUD提示框,定时任务、开发关于资源常见问题
查看>>
Day2 - Python基础2作业【文件操作--购物车程序(用户操作及商户操作)】
查看>>
网页性能优化
查看>>
文摘:OUTER JOIN
查看>>
SQL学习笔记5
查看>>
http://git.oschina.net/chunanyong/springrain
查看>>
WPF 下两种图片合成或加水印的方式
查看>>
2013=10=27 字符串 统计 ,删除,连接,变换
查看>>
(转)Android中的Shape使用总结
查看>>
解决stackoverflow打开慢不能注册登录
查看>>
谈谈newDate()的简单使用 JS
查看>>