GDAL从二进制数据流中构造数据集

简介: GDAL从二进制数据流中构造数据集

GDAL从二进制数据流中构造数据集

目录

1. 概述

参看《从二进制数据流中构造GDAL可以读取的图像数据》这篇文章。这个问题的内涵在于,处理图像时都会将其读取成宽X高X波段的三维数组的内存Buffer,但是图像文件本身却会被压缩成各种各样的数据类型(jpg、png、tif等)。在某些直接获取到数据流的情况下,可以直接在内存中构建GDAL数据集并进行读写操作,这样就可以避免磁盘IO的性能。

以个人的实际经验来看,有两个地方用到了这个功能:

  1. 从远端(Web)访问数据,可以先一次性获取到内存Buffer,然后在内存中构建GDAL数据集。
  2. gltf的bin中内嵌了jpg/png图像文件,可以直接获取二进制文件流,然后在内存中构建GDAL数据集。

2. 实现

按照自己的使用习惯,试用了一下《从二进制数据流中构造GDAL可以读取的图像数据》的例子,基本没什么问题:

#include <iostream>
#include <gdal_priv.h>
using namespace std;
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 main()
{
  GDALAllRegister();          //GDAL所有操作都需要先注册格式
  CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");  //支持中文路径
  // 为了构造内存文件,必须有一个内存文件名称,以/vsimem/开头,后面的随便啥都行
  string osMemFileName = "/vsimem/00000000";
  // 写了一个函数,读取二进制数据,也可以从数据库中或者网络啥的获取图像的二进制流存储在pabyData中
  const char* imgPath = "D:/dst1.jpg";
  int nDataSize = 0;
  GByte* pabyData = GetStream(imgPath, nDataSize);
  // 将二进制流构造到MEM文件中
  VSIFCloseL(VSIFileFromMemBuffer(osMemFileName.c_str(), pabyData, nDataSize, FALSE));
    
  GDALDataset* img = (GDALDataset *)GDALOpen(imgPath, GA_ReadOnly);
  if (!img)
  {
    cout << "Can't Open Image!" << endl;
    return 1;
  }
  // 处理结束后,将内存文件进行释放
  VSIUnlink(osMemFileName.c_str());
  delete[] pabyData;
  pabyData = nullptr;
  int imgWidth = img->GetRasterXSize();   //图像宽度
  int imgHeight = img->GetRasterYSize();  //图像高度
  int bandNum = img->GetRasterCount();    //波段数
  int depth = GDALGetDataTypeSize(img->GetRasterBand(1)->GetRasterDataType()) / 8;    //图像深度
  cout << imgWidth << '\t' << imgHeight << '\t' << bandNum << '\t' << depth << endl;
  GDALClose(img);
  img = nullptr;
}

读取到的宽、高、波段以及深度:

也可以进行进一步的读写操作。

分类: GDAL

标签: 数据集 , 数据流 , GDAL


相关文章
|
4月前
|
机器学习/深度学习 人工智能 芯片
42_大语言模型的计算需求:从GPU到TPU
随着2025年大语言模型技术的持续突破和规模化应用,计算资源已成为推动AI发展的关键驱动力。从最初的CPU计算,到GPU加速,再到专用AI加速器的崛起,大语言模型的计算需求正在重塑全球数据中心的基础设施架构。当前,全球AI半导体市场规模预计在2027年将达到2380亿美元(基本情境)甚至4050亿美元(乐观情境),这一增长背后,是大语言模型对计算能力、内存带宽和能效比的极致追求。
|
前端开发
前端引入字体文件
文章介绍了如何在前端项目中引入字体文件,并展示了具体的HTML和CSS代码示例,包括如何使用`@font-face`规则来定义字体和在页面中应用自定义字体。
573 1
前端引入字体文件
|
12月前
|
存储 数据采集 JSON
Python爬取某云热歌榜:解析动态加载的歌曲数据
Python爬取某云热歌榜:解析动态加载的歌曲数据
|
自然语言处理 搜索推荐 API
如何构建一套qwen-max智能体拥有媲美通义千问在线接口的能力
基于Qwen-Max构建的智能系统,融合了自然语言处理、决策引擎、任务识别与工具选择等技术,具备强大的多模态理解和生成能力。该系统能自动分析用户输入,识别任务类型,选择最优工具执行任务,并整合结果反馈给用户,广泛应用于查询、生成、翻译和图像处理等多个领域,显著提升了任务处理效率和智能化水平。
924 9
|
数据库连接 C++
什么是RAII原则
【10月更文挑战第19天】什么是RAII原则
558 1
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
569 1
|
JSON Java 数据格式
实现自定义序列化和反序列化控制的5种方式
实现自定义序列化和反序列化控制的5种方式
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
468 0
|
XML Java 网络架构
Webservice使用
Webservice使用
414 2
|
开发框架 搜索推荐 安全
【Uniapp 专栏】基于 Uniapp 的电商应用开发案例解析
【5月更文挑战第12天】使用Uniapp跨平台框架开发电商应用,结合丰富的组件和API,实现首页、商品详情、购物车及订单等关键功能。注重界面设计和用户体验,处理商品逻辑、订单管理和支付接口集成。同时,适应多平台特性,加入个性化推荐、商品直播和社交分享等特色功能,以降低成本、提升竞争力,打造高效购物体验。此案例展示了Uniapp在电商领域的潜力和优势。
693 4