GDAL中通过GDALDriver类的Create函数实现图像的保存
GDAL中除了读取各种类型的图像外,也可以实现对各种图像的保存操作,具体实现测试代码如下:
int test_gadl_GDALDataset_write() { const char* image_name = "E:/GitCode/GDAL_Test/test_images/1.jpg"; { // write bgr: CreateCopy GDALAllRegister(); const char* pszFormat = "jpeg"; //"bmp";// "png";//"GTiff"; GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat); if (!poDriver) { fprintf(stderr, "get driver by name failed\n"); return -1; } char** papszMetadata = poDriver->GetMetadata();; if (CSLFetchBoolean(papszMetadata, GDAL_DCAP_CREATE, FALSE)) fprintf(stderr, "Driver %s supports Create() method.\n", pszFormat); if (CSLFetchBoolean(papszMetadata, GDAL_DCAP_CREATECOPY, FALSE)) fprintf(stderr, "Driver %s supports CreateCopy() method.\n", pszFormat); if (!CSLFetchBoolean(papszMetadata, GDAL_DCAP_CREATECOPY, FALSE)) { fprintf(stderr, "Driver %s don't supports CreateCopy() method.\n", pszFormat); return -1; } GDALDataset* poDataset = (GDALDataset*)GDALOpen(image_name, GA_ReadOnly); if (poDataset == nullptr) { std::cout << "input image error" << std::endl; return -1; } const char* pszDstFilename = "E:/GitCode/GDAL_Test/test_images/ret_1.jpg"; // All drivers that support creating new files support the CreateCopy() method, but only a few support the Create() method GDALDataset* poDstDS = poDriver->CreateCopy(pszDstFilename, poDataset, FALSE, nullptr, nullptr, nullptr); if (!poDstDS) { std::cout << "create copy failed" << std::endl; return -1; } GDALClose((GDALDatasetH)poDataset); GDALClose((GDALDatasetH)poDstDS); } { // write: bgr<->rgb GDALAllRegister(); const char* pszFormat = "GTiff"; GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat); if (!poDriver) { fprintf(stderr, "get driver by name failed\n"); return -1; } char** papszMetadata = poDriver->GetMetadata();; if (!CSLFetchBoolean(papszMetadata, GDAL_DCAP_CREATE, FALSE)) { fprintf(stderr, "Driver %s don't supports Create() method.\n", pszFormat); return -1; } GDALDataset* poDataset = (GDALDataset*)GDALOpen(image_name, GA_ReadOnly); if (poDataset == nullptr) { std::cout << "input image error" << std::endl; return -1; } int width = poDataset->GetRasterXSize(); int height = poDataset->GetRasterYSize(); int band_count = poDataset->GetRasterCount(); GDALDataType gdal_data_type = poDataset->GetRasterBand(1)->GetRasterDataType(); int pBandMap[3] = { 1, 2, 3 }; unsigned char* pData = new unsigned char[width * height * band_count]; //RRRR...BBBB...GGGG... poDataset->RasterIO(GF_Read, 0, 0, width, height, pData, width, height, gdal_data_type, band_count, pBandMap, 0, 0, 0); char** papszOptions = nullptr; papszOptions = CSLSetNameValue(papszOptions, "INTERLEAVE", "BAND"); const char* pszDstFilename = "E:/GitCode/GDAL_Test/test_images/ret_2.jpg"; GDALDataset* poDstDS = poDriver->Create(pszDstFilename, width, height, band_count, gdal_data_type, papszOptions); if (!poDstDS) { std::cout << "create copy failed" << std::endl; return -1; } int pBandMap_[3] = { 3, 2, 1 }; poDstDS->RasterIO(GF_Write, 0, 0, width, height, pData, width, height, gdal_data_type, band_count, pBandMap_, 0, 0, 0); GDALClose((GDALDatasetH)poDataset); GDALClose((GDALDatasetH)poDstDS); delete[] pData; } { // write: bgr->b, single channel GDALAllRegister(); const char* pszFormat = "GTiff"; GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat); if (!poDriver) { fprintf(stderr, "get driver by name failed\n"); return -1; } char** papszMetadata = poDriver->GetMetadata();; if (!CSLFetchBoolean(papszMetadata, GDAL_DCAP_CREATE, FALSE)) { fprintf(stderr, "Driver %s don't supports Create() method.\n", pszFormat); return -1; } GDALDataset* poDataset = (GDALDataset*)GDALOpen(image_name, GA_ReadOnly); if (poDataset == nullptr) { std::cout << "input image error" << std::endl; return -1; } int width = poDataset->GetRasterXSize(); int height = poDataset->GetRasterYSize(); int band_count = poDataset->GetRasterCount(); GDALDataType gdal_data_type = poDataset->GetRasterBand(1)->GetRasterDataType(); unsigned char* pData = new unsigned char[width * height]; GDALRasterBand* poBand = poDataset->GetRasterBand(2); // from 1 to GetRasterCount() poBand->RasterIO(GF_Read, 0, 0, width, height, pData, width, height, gdal_data_type, 0, 0, 0); char** papszOptions = nullptr; papszOptions = CSLSetNameValue(papszOptions, "INTERLEAVE", "BAND"); const char* pszDstFilename = "E:/GitCode/GDAL_Test/test_images/ret_3.jpg"; GDALDataset* poDstDS = poDriver->Create(pszDstFilename, width, height, 1, gdal_data_type, papszOptions); if (!poDstDS) { std::cout << "create copy failed" << std::endl; return -1; } int bandMap { 1 }; poDstDS->RasterIO(GF_Write, 0, 0, width, height, pData, width, height, gdal_data_type, 1, &bandMap, 0, 0, 0); GDALClose((GDALDatasetH)poDataset); GDALClose((GDALDatasetH)poDstDS); delete[] pData; } { // write: crop image GDALAllRegister(); const char* pszFormat = "GTiff"; GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat); if (!poDriver) { fprintf(stderr, "get driver by name failed\n"); return -1; } char** papszMetadata = poDriver->GetMetadata();; if (!CSLFetchBoolean(papszMetadata, GDAL_DCAP_CREATE, FALSE)) { fprintf(stderr, "Driver %s don't supports Create() method.\n", pszFormat); return -1; } GDALDataset* poDataset = (GDALDataset*)GDALOpen(image_name, GA_ReadOnly); if (poDataset == nullptr) { std::cout << "input image error" << std::endl; return -1; } int width = poDataset->GetRasterXSize() / 2; int height = poDataset->GetRasterYSize() / 2; int band_count = poDataset->GetRasterCount(); GDALDataType gdal_data_type = poDataset->GetRasterBand(1)->GetRasterDataType(); unsigned char* pData = new unsigned char[width * height * band_count]; int pBandMap[3] = { 1, 2, 3 }; poDataset->RasterIO(GF_Read, 0, 0, width, height, pData, width, height, gdal_data_type, band_count, pBandMap, 0, 0, 0); const char* pszDstFilename = "E:/GitCode/GDAL_Test/test_images/ret_4.jpg"; GDALDataset* poDstDS = poDriver->Create(pszDstFilename, width, height, band_count, gdal_data_type, nullptr); if (!poDstDS) { std::cout << "create copy failed" << std::endl; return -1; } poDstDS->RasterIO(GF_Write, 0, 0, width, height, pData, width, height, gdal_data_type, band_count, pBandMap, 0, 0, 0); GDALClose((GDALDatasetH)poDataset); GDALClose((GDALDatasetH)poDstDS); delete[] pData; } return 0; }
GitHub:https://github.com/fengbingchun/GDAL_Test
GDAL中通过GDALDriver类的Create函数实现图像的保存的更多相关文章
- C++中怎么获取类的成员函数的函数指针?
用一个实际代码来说明. class A { public: staticvoid staticmember(){cout<<"static"<<endl;} ...
- VC/MFC中通过CWebPage类调用javascript函数(给js函数传参,并取得返回值)
转自:http://www.cnblogs.com/javaexam2/archive/2012/07/14/2632959.html ①需要一个别人写好的类CWebPage,将其对于的两个文件Web ...
- CImageList类Create函数参数解析
前面提到了CImageList类的Create(...)函数,虽然MSDN上已经有所解释,但仍有网友问到参数的具体含义,下面就我的理解,对参数进行一次轻量级的剖析 函数原型(其他重载函数请参看msdn ...
- Cocos2d-x Lua中Sprite精灵类
精灵类是Sprite,它的类图如下图所示. Sprite类图 Sprite类直接继承了Node类,具有Node基本特征.此外,我们还可以看到Sprite类的子类有:PhysicsSprite和Skin ...
- 【转载】C++中的基类与派生类
转自:http://www.cnblogs.com/sujz/articles/2044365.html 派生类的继承方式总结: 继承方式 说明 public 基类的public和protected的 ...
- C++中的基类与派生类
派生类的继承方式总结: 继承方式 说明 public 基类的public和protected的成员被派生类继承后,保持原来的状态 private 基类的public和protected的成员被派生类继 ...
- C++中的基类和派生类
转载自:http://www.cnblogs.com/sujz/archive/2011/05/12/2044365.html 派生类的继承方式总结: 继承方式 说明 public 基类的public ...
- Oracle数据库中调用Java类开发存储过程、函数的方法
Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日 浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...
- javascript中如何让类工厂和构造函数变成同一个函数
我们知道在js中可以用一个函数来定义对象的类,该函数称之为对象的构造函数,我们在需要create对象的时候直接调用这个构造函数即可: var Man = funciton(name){ this.na ...
随机推荐
- Hadoop Spark 基础教程
0x01 Hadoop 慕课网 https://www.imooc.com/learn/391 Hadoop基础 慕课网 https://www.imooc.com/learn/890 Hadoop ...
- CentOS7.X安装Redis-4.0.8以及Redis集群搭建
安装redis 安装前的准备 yum install \ vim \ wget \ make \ gcc \ gcc-c++ \ automake \ autoconf \ -y \ 下载解压并安装 ...
- BZOJ1012:[JSOI2008]最大数maxnumber(线段树)
Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L 个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. ...
- 【[POI2010]ANT-Antisymmetry】
开始复习字符串了 第一步肯定得是\(hash\) 首先理性分析一波不可能出现长度为奇数的反回文串,对称轴位置取反之后肯定和原来不相等了 我们可以枚举所有回文串的对称中心,之后我们发现这个样子是具有单调 ...
- 【nodejs】学习笔记
学习链接:http://www.cnblogs.com/zhongweiv/p/nodejs_environment.html (一)简介及环境安装 Node.js是让Javascript脱离浏览器运 ...
- HTTP 错误 401.0 - Unauthorized 的解决方案
1.安装vs2015后,以前做的项目中Forms身份验证,竟然不能使用了 2.打开当前项目属性,将windows身份验证属性改为启用 3.vs2015生成的mvc项目中,webconfig缺失auth ...
- 【转】如何开发自己的HttpServer-NanoHttpd源码解读
现在作为一个开发人员,http server相关的内容已经是无论如何都要了解的知识了.用curl发一个请求,配置一下apache,部署一个web server对我们来说都不是很难,但要想搞清楚这些背后 ...
- 使用MVVM设计模式构建WPF应用程序
使用MVVM设计模式构建WPF应用程序 本文是翻译大牛Josh Smith的文章,WPF Apps With The Model-View-ViewModel Design Pattern,译者水平有 ...
- 关于"XML 文档(2, 2)中有错误:不应有 <xml xmlns=''>"错误
XML文件名 <?xml version="1.0" encoding="utf-8"?> <Config xmlns:xsi="h ...
- PAT——1051. 复数乘法
复数可以写成(A + Bi)的常规形式,其中A是实部,B是虚部,i是虚数单位,满足i2 = -1:也可以写成极坐标下的指数形式(R*e(Pi)),其中R是复数模,P是辐角,i是虚数单位,其等价于三角形 ...