1. 概述

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

2. 实现

具体的实例如下:

#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图像:

GDAL创建JPG或PNG格式图像的更多相关文章

  1. 在VC下显示JPEG、GIF格式图像的一种简便方法

    在VC下显示JPEG.GIF格式图像的一种简便方法 一. 引言  JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛 ...

  2. ENVI显示GDAL创建GeoTiff文件的一个问题及其思考

    作者:朱金灿 来源:http://blog.csdn.net/clever101 使用gdal创建一个100*100的红色的geotiff图像,代码如下: #include <assert.h& ...

  3. MySQL创建数据库[保存mojo格式的数据库]已经常用的utf8格式数据库

    一.创建最新编码utf8mb4格式的库: CREATE DATABASE IF NOT EXISTS yourdbname CHARACTER SET utf8mb4 COLLATE utf8mb4_ ...

  4. bmp格式图像的读写函数(对一个开源代码的封装)

    在网上看到一段读写bmp格式图像的代码,本文对这段代码分成两个函数封装起来方便使用,一个函数是读取bmp格式的图像,一个是向指定文件写入bmp格式的图像. 前提 我们不需要知道这段代码是如何读取bmp ...

  5. GDAL创建图像提示Driver xxx does not support XXX creation option的原因

    经常在群里有人问,创建图像的时候为什么老是提示下面的信息. CPLError: Driver GTiff does not support DCAP_CREATE creation option Wa ...

  6. 利用GDAL从内存中直接解析图像数据

    对于网络数据源,调度中可以把数据写入本地,然后读取本地数据格式进行影像的解析(地形有时候也用tif等格式). 此种方式会每次调度进行不必要的IO开销和时间花费. GDAL提供了相应的接口,直接从内存中 ...

  7. HTML与CSS入门——第十章 创建用于Web上的图像

    知识点: 1.选择图像软件的方法 2.准备用于网上的照片的方法 3.创建标题和按钮的方法 4.减少图像中颜色数量的方法 5.创建透明图像的方法 6.创建平铺背景的方法 7.创建Web动画的方法 10. ...

  8. 使用GDAL将下载的Google卫星图像转为带坐标的tif

    网上有很多下载Google地图的卫片的软件,一般下载下来的图像都是jpg格式的,另外附带一个坐标信息的描述文件.这样的数据不能直接拿来在遥感或者GIS软件中使用,因为图像里面没有投影和坐标信息,所以就 ...

  9. 【视频开发】非常优秀的CxImage各种格式图像开源工具

    下面介绍应用它进行图像类型转换的方式: 1.从一种图像文件类型转换为另一种文件类型(convert from a format to another)  CxImage   image;    //  ...

  10. 在C#中使用GDAL创建Shape文件

    这几天在项目中考虑使用GDAL,由于10年没有用过VC了,就在网上搜了下怎么样在C# 中使用GDAL,看到了http://blog.csdn.net/liminlu0314/article/detai ...

随机推荐

  1. 将python程序打包为exe可执行文件方法

    将py打包为exe文件需要依赖pyinstaller第三方库 -F:打包后只生成单个exe格式文件: -D:默认选项,创建一个目录,包含exe文件以及大量依赖文件: -c:默认选项,使用控制台(就是类 ...

  2. 如何用ppt打印9张一面,并且去除边距?

    如何用ppt打印9张一面,并且去除边距?      方法其实很简单,答主不要在ppt软件的打印选项里设置[每页打印9张幻灯片],而是使用默认的[每页打印1张幻灯片]. 然后去[打印机属性]里设置,我是 ...

  3. os --- 多种操作系统接口¶

    os.path --- 常用路径操作 源代码: Lib/posixpath.py (用于 POSIX) 和 Lib/ntpath.py (用于 Windows). 此模块实现了一些有用的路径名称相关函 ...

  4. C#堆排序算法

    前言 堆排序是一种高效的排序算法,基于二叉堆数据结构实现.它具有稳定性.时间复杂度为O(nlogn)和空间复杂度为O(1)的特点. 堆排序实现原理 构建最大堆:将待排序数组构建成一个最大堆,即满足父节 ...

  5. jmeter生成HTML性能测试报告(非GUI的命令)

    非GUI的命令(在cmd执行即可 不需要打开jmeter) 使用命令:jmeter  -n  -t  [jmx file]  -l  [jtl file]  -e  -o   [report path ...

  6. vue2.0组件之间传递数据

    vue2.0组件之间传递数据 一,父向子 当父组件向子组件传数据的时候用这种方法比较简单.步骤为: 1,在子组件中声明props 2,在父组件中使用子组件时传入数据 二,组件之间 在组件之间如果两个组 ...

  7. 详解.NET依赖注入中对象的创建与“销毁”

    在DI容器中注册类型,DI容器就可以帮我们创建类型的实例:如果注册类型实现了IAsyncDisposable或者IDisposable接口,对象销毁时DI容器还会帮我们调用DisposeAsync或D ...

  8. 13. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP中的压缩gzip,deflate,brotli算法

    用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP中的压缩gzip,deflate,brotli算法 项目 ++wmproxy++ gite: https://gitee.com/ ...

  9. 调和级数发散率证明|欧拉常数|ln n+gamma+varepsilon_k证明|sigma(1/i)

    最近在做一个 练习 ,然后看到了 调和级数 这个东西,说实话这东西谁能在考场上想到,平日还是要多积累. 开门见山 但是我们今天只证这个东西: \[\sum^{n}_{i = 1} \frac{1}{n ...

  10. Java SPI机制学习之开发实例

    原创/朱季谦 在该文章正式开始前,先对 Java SPI是什么做一个简单的介绍. SPI,是Service Provider Interface的缩写,即服务提供者接口,它允许开发人员定义一组接口,并 ...