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函数实现图像的保存的更多相关文章

  1. C++中怎么获取类的成员函数的函数指针?

    用一个实际代码来说明. class A { public: staticvoid staticmember(){cout<<"static"<<endl;} ...

  2. VC/MFC中通过CWebPage类调用javascript函数(给js函数传参,并取得返回值)

    转自:http://www.cnblogs.com/javaexam2/archive/2012/07/14/2632959.html ①需要一个别人写好的类CWebPage,将其对于的两个文件Web ...

  3. CImageList类Create函数参数解析

    前面提到了CImageList类的Create(...)函数,虽然MSDN上已经有所解释,但仍有网友问到参数的具体含义,下面就我的理解,对参数进行一次轻量级的剖析 函数原型(其他重载函数请参看msdn ...

  4. Cocos2d-x Lua中Sprite精灵类

    精灵类是Sprite,它的类图如下图所示. Sprite类图 Sprite类直接继承了Node类,具有Node基本特征.此外,我们还可以看到Sprite类的子类有:PhysicsSprite和Skin ...

  5. 【转载】C++中的基类与派生类

    转自:http://www.cnblogs.com/sujz/articles/2044365.html 派生类的继承方式总结: 继承方式 说明 public 基类的public和protected的 ...

  6. C++中的基类与派生类

    派生类的继承方式总结: 继承方式 说明 public 基类的public和protected的成员被派生类继承后,保持原来的状态 private 基类的public和protected的成员被派生类继 ...

  7. C++中的基类和派生类

    转载自:http://www.cnblogs.com/sujz/archive/2011/05/12/2044365.html 派生类的继承方式总结: 继承方式 说明 public 基类的public ...

  8. Oracle数据库中调用Java类开发存储过程、函数的方法

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

  9. javascript中如何让类工厂和构造函数变成同一个函数

    我们知道在js中可以用一个函数来定义对象的类,该函数称之为对象的构造函数,我们在需要create对象的时候直接调用这个构造函数即可: var Man = funciton(name){ this.na ...

随机推荐

  1. chrome浏览器Network面板请求Timing分析

    Timing显示资源在整个请求生命周期过程中各部分话费的时间. Queueing 排队的时间花费.可能由于该请求被渲染引擎认为是优先级比较低的资源(图片).服务器不可用.超过浏览器并发请求的最大连接数 ...

  2. 好用的纯CSS加载动画-spinkit

    首先放一个css  spinkit <style> .loaders{ width: 100%; height: 100%; padding: 100px; box-sizing: bor ...

  3. Python 多线程 start()和run()方法的区别(三)

    上一篇文章最后只是简单介绍了start()方法和run()方法,这篇文章再详细地看下start()和run()的区别. 在实例调用的函数中加入打印当前线程的名字,分别用start()方法和run()方 ...

  4. mysql服务器参数

    mysql服务器参数: 配置是从上往下读取,同一个参数项,后边的配置项会覆盖前边的配置项 mysql获取配置信息路径: 命令行参数    mysqld_safe  --datadir=/data/sq ...

  5. Dubbo实践(十四)生产者发布服务

    Export发布服务流程 Dubbo协议向注册中心发布服务:当服务提供方,向dubbo协议的注册中心发布服务的时候,是如何获取,创建注册中心的,如何注册以及订阅服务的,下面我们来分析其流程. 看如下配 ...

  6. python中matplotlib总结

    该总结只是为了记录自己学习过程中容易遗忘的问题,权当一个记事本使用. 1:散点图 plt.scatter()函数的原型 scatter(x, y, s=s, c=c, marker=marker, c ...

  7. 模块XXXX可能与您正在运行的Windows版本不兼容。检查该模块是否与regsvr32.exe的x86(32位)x64(64位)版本兼容。

    最近自己在编写ActiveX控件.遇到的麻烦事不少. 今天遇到了这个问题“模块XXXX可能与您正在运行的Windows版本不兼容.检查该模块是否与regsvr32.exe的x86(32位)x64(64 ...

  8. FD.io社区中国行暨未来网络技术沙龙·南京站 会议小结

    What is FD.io VPP? FD.io VPP(Fast Data Input/Output Vector Packet Processing)is a new network multi- ...

  9. VS2017 编译 QT5.10.1 X64位 静态库 MT

    参考文章 https://blog.csdn.net/Devout_programming/article/details/78827112 准备工作* Supported compiler (Vis ...

  10. svg路径动画心得

    svg动画,随着路线运动,项目中需要用到,接触的时候感觉很高级,但是不会-无从下手呀!于是在网上找相关资料,先借鉴再修改成自己的. <svg width="500" heig ...