前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GDAL创建JPG或PNG格式图像

GDAL创建JPG或PNG格式图像

作者头像
charlee44
发布2021-11-09 16:19:56
1.7K0
发布2021-11-09 16:19:56
举报
文章被收录于专栏:代码编写世界代码编写世界

目录

1. 概述

根据GDAL文档,JPG/PNG格式支持读取和批量写入,但不支持实时更新。也就是不支持Create()方法,但是支持CreateCopy()方法。也可能是由于JPG/PNG格式是轻量化的压缩格式决定的。

2. 实现

具体的实例如下:

代码语言:javascript
复制
#include <iostream>
#include <gdal_priv.h>

using namespace std;

int main()
{
	GDALAllRegister();          //GDAL所有操作都需要先注册格式
	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");  //支持中文路径

	//图像参数
	string tilePath = "D:/1.png";
	//string tilePath = "D:/1.jpg";
	int tileSizeX = 256;
	int tileSizeY = 256;
	int dstBand = 3;
	int dstDepth = 1;

	//分配缓冲区
	size_t tileBufSize = (size_t)tileSizeX * tileSizeY * dstBand;
	GByte *tileBuf = new GByte[tileBufSize];
	memset(tileBuf, 0, tileBufSize * sizeof(GByte));

	//绘制一个斜线
	for (int yi = 0; yi < tileSizeY; yi++)
	{
		for (int xi = 0; xi < tileSizeX; xi++)
		{
			if (xi != yi)
			{
				continue;
			}
			size_t m = (size_t)tileSizeX * dstBand * yi + dstBand * xi;
			for (int bi = 0; bi < dstBand; bi++)
			{
				tileBuf[m + bi] = 255;
			}			
		}
	}

	//把数据保存到临时文件MEM  
	GDALDriver *pDriverMEM = GetGDALDriverManager()->GetDriverByName("MEM");
	GDALDataset *pOutMEMDataset = pDriverMEM->Create("", tileSizeX, tileSizeY, dstBand, GDT_Byte, NULL);
	if (!pOutMEMDataset)
	{
		printf("Can't Write Image!");
		return false;
	}
	pOutMEMDataset->RasterIO(GF_Write, 0, 0, tileSizeX, tileSizeY, tileBuf, tileSizeX, tileSizeY,
		GDT_Byte, dstBand, nullptr, dstBand*dstDepth, tileSizeX*dstBand*dstDepth, dstDepth);

	//以创建复制的方式,生成png文件
	GDALDriver *pDriverPNG = GetGDALDriverManager()->GetDriverByName("PNG");
	//GDALDriver *pDriverPNG = GetGDALDriverManager()->GetDriverByName("JPEG");	
	GDALDataset* tile = pDriverPNG->CreateCopy(tilePath.c_str(), pOutMEMDataset, TRUE, 0, 0, 0);
	if (!tile)
	{
		printf("Can't Write Image!");
		return false;
	}

	GDALClose(pOutMEMDataset);
	pOutMEMDataset = nullptr;

	GDALClose(tile);
	tile = nullptr;	

	if (tileBuf)
	{
		delete[] tileBuf;
		tileBuf = nullptr;
	}
}

这里创建了一个画着对角线的JPG/PNG图像:

imglink1
imglink1
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-11-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 概述
  • 2. 实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档