在很多时候,我们的图像数据往往都不是文件方式存储在磁盘上,而是可能从网络或者数据库中获取的是二进制的图像数据流。最简单的方式和最容易想到的方式就是将这个文件流保存到磁盘上形成一个文件,然后再使用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函数用来读取一个数据流。详细的注视都在代码里面了。

从二进制数据流中构造GDAL可以读取的图像数据相关推荐

  1. 从二进制数据流中构造GDAL可以读取的图像数据(C#)

    在上一篇博客中,讲了一下使用GDAL从文件流中构造一个GDAL可以识别的数据来进行处理.原以为这个接口在C#中没有,仔细看了下GDAL库中源码,发现C#版本也有类似的函数,下面是GDAL库中的一个C# ...

  2. QT中使用GDAL多线程读取遥感图像到QImage

    GDAL 是一个很强大的可以读取很多格式 的带有GIS信息的栅格型图像.前阵子项目中需要读取遥感图像,并显示到QT界面,由于遥感图像一般很大,所以采取新开一个读图线程的方式来读取,防止界面假死.下面是 ...

  3. 读取16bit图像数据小结

    opencv2 读取16bit图像数据小结 https://blog.csdn.net/zhyh1435589631/article/details/49275945 今天师弟跑来问我一个关于open ...

  4. GDAL库读取Envisat ASAR数据

    GDAL库本身就可以读取Envisat的图像数据,具体链接为:http://www.gdal.org/frmt_various.html#Envisat. 但是对于ASAR传感器的数据来说,GDAL在 ...

  5. 【Unity3D日常开发】Unity3D中打包WEBGL后读取本地文件数据

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  6. opencv2 读取16bit图像数据小结

    今天师弟跑来问我一个关于opencv图像值读取的问题, 原话是这样的 在opencv中想要加载一幅16位的图像,鼠标点击显示其位置和灰度数值,但是我写的程序中灰度数值最多只能显示255 拿到这个问题, ...

  7. Python 中 MNE 读取EEG竞赛数据绘图和提取epoch(gdf格式)

    上一篇文章中介绍了研究读取gdf格式数据的心路历程,绕了半天竟然直接操作就可以.本来以为会很容易,毕竟数据都已经成功读入了,可是我又错了,弄了好久读取的数据绘图都不对(打印看数据是对的),感觉是mne ...

  8. JAVA imread_利用Matlab中的imread怎么读取图片

    展开全部 方法/步骤 1.在matlab软件中,读取32313133353236313431303231363533e59b9ee7ad9431333337613137图像数据(载入)利用的是imre ...

  9. 【Matlab】Matlab读取dcm图像的函数以及CT值失真的问题处理

    Matlab版本:2020a 一.dicomread函数 Matlab读取dcm图像的函数是dicomread,根据dicomread的帮助文档,该函数有四种参数输入方式: X = dicomread ...

最新文章

  1. java cursor_使用3.0驱动程序的Java中的Tailable Cursor示例?
  2. 干货 | 携程是如何做AB实验分流的
  3. 使用ssh连接WSL
  4. Scala集合常用方法:reduceLeft/reduceRight
  5. 华为发布最强服务器芯片,[百家号]华为:最强ARM服务器芯片,华为鲲鹏920处理器发布...
  6. 的garch预测_随机森林预测
  7. Java中try catch finally语句中含有return语句的执行情况
  8. Oracle和Mysql的不同
  9. linux多级反馈队列的实现,多级反馈队列调度算法的实现
  10. Linux daemontools安装及使用
  11. 【BIT云计算大作业】基于Spark的K近邻(KNN)查询以及K-mer计数
  12. 中美创客大赛历年获奖作品展
  13. R 数据正态分布检验
  14. Android 解决OutOfMemory,从避免内存溢出开始
  15. GameofMir引擎架设传奇服务器【3:在服务器上架设引擎】
  16. 计算机平面设计基础 photoshop基本操作
  17. 为什么打开wps文字背景是绿色的?怎么变成白色的呢?
  18. 梅森数形如2n−1的素数称为梅森数(Mersenne Number)
  19. Python:实现骰子游戏
  20. 网站导航栏SEO优化方法

热门文章

  1. 数据挖掘与其商务智能上的应用的实验报告
  2. java获取路径中的文件名_3种Java从文件路径中获取文件名的方法
  3. GPS/BDS:AGPS定位基本机制
  4. mysql删除员工_MySQL误删数据救命指南:开发人员必收藏
  5. python面向对象编程指南 脚本之家_Python面向对象编程之继承与多态详解
  6. 【Spring第七篇】Java配置类:JavaConfig
  7. 力扣——字符串转换整数 (atoi)
  8. MySQL多个条件更新多个字段
  9. rtl8811au黑苹果10.15_荣耀MagicBook I5黑苹果折腾记(超详细教程与排坑)
  10. saas系统是什么_什么是灵活用工智能财税SaaS系统?有什么好处?