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 ...
随机推荐
- mysql-存储过程(转载)
本来想自己写存储过程的,但是看到别人写的很全面,就直接转载过来了. 转自(http://www.cnblogs.com/exmyth/p/3303470.html) 14.1.1 创建存储过程 MyS ...
- 「BZOJ3226」[Sdoi2008]校门外的区间
题目 首先是开闭区间的处理,我们把\(1.5\)这种数加进来,用\([1.5,6]\)来表示\((2,6]\) 根据离散数学的基本知识,尝试把五个操作转化成人话 把\([x,y]\)变成\(1\) 把 ...
- Hadoop学习之路(十九)MapReduce框架排序
流量统计项目案例 样本示例 需求 1. 统计每一个用户(手机号)所耗费的总上行流量.总下行流量,总流量 2. 得出上题结果的基础之上再加一个需求:将统计结果按照总流量倒序排序 3. 将流量汇总统计结果 ...
- Odoo中的逆计算——由compute字段的值逆向修改其依赖值
转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9281406.html 当通过compute属性指定方法,根据依赖值计算得到当前字段值时.一般也要制定这个计算的 ...
- 7、Web Service-IDEA-jaxws规范下的 服务端/客户端 开发
前提简介:这里之后即使基于IDEA进行开发的,风格与之前有些不同之处! 1.服务端的开发 1.创建新的项目 2.pom.xml 添加开发时所需要的依赖 <?xml version="1 ...
- ubuntu查询命令行安装的软件的安装路径
which git // 查询git的安装路径
- codeforces472D
Design Tutorial: Inverse the Problem CodeForces - 472D 给你了一个 n × n最短距离矩阵.(即矩阵中dis[u][v]为u点到v点的最短距离), ...
- ubuntu配置telnet服务
1.安装xinetd 以及telnetd #:~$ sudo apt-get install xinetd telnetd 2.配置文件(若文件不存在就手动添加文件和相应配置信息) 1): #:~$ ...
- Java解析Excel之应用Reflection等技术实现动态读取
目录树 背景 技术选型 问题分析 技术要点及难点分析 源码分析 测试用例 背景 Tip:因为产品提的需求我都开发完了,进行了项目提测:前天老大走过来说:你用spring-boot开发一个解析Excel ...
- rman基础知识理解(一)
rman用于对数据库的备份和恢复. 他的命令主要分成两大类:独立命令和批处理命令: 独立命令只能在rman的提示符下执行,主要的命令有: CONNECT CONFIGURE CREATE CATALO ...