GDAL创建JPG或PNG格式图像

简介: GDAL创建JPG或PNG格式图像

GDAL创建JPG或PNG格式图像

目录

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

标签: Create , PNG , JPG , GDAL


相关文章
linux实用技巧:cp时自动将软链接所指定的文件实体也一起copy(软链接将会变成目标文件实体)
linux实用技巧:cp时自动将软链接所指定的文件实体也一起copy(软链接将会变成目标文件实体)
linux实用技巧:cp时自动将软链接所指定的文件实体也一起copy(软链接将会变成目标文件实体)
|
计算机视觉
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
在使用OpenCV的cv2模块保存带有中文命名的图片时,直接使用cv2.imwrite()会导致乱码问题,可以通过改用cv2.imencode()方法来解决。
1340 0
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
|
机器学习/深度学习 并行计算 PyTorch
英伟达新一代GPU架构(50系列显卡)PyTorch兼容性解决方案
本文记录了在RTX 5070 Ti上运行PyTorch时遇到的CUDA兼容性问题,分析其根源为预编译二进制文件不支持sm_120架构,并提出解决方案:使用PyTorch Nightly版本、更新CUDA工具包至12.8。通过清理环境并安装支持新架构的组件,成功解决兼容性问题。文章总结了深度学习环境中硬件与框架兼容性的关键策略,强调Nightly构建版本和环境一致性的重要性,为开发者提供参考。
10334 64
英伟达新一代GPU架构(50系列显卡)PyTorch兼容性解决方案
UE4动画蓝图节点Layered blend per bone详解
UE4动画蓝图节点Layered blend per bone详解
1205 1
|
人工智能 数据可视化 API
语义分割笔记(一):基于PaddleSeg使用Transfomer模型对航空遥感图像分割
这篇博客介绍了如何使用PaddleSeg和Transformer模型SegFormer B3对航空遥感图像进行语义分割,包括项目背景、数据集处理、训练步骤和代码实现。
1811 1
语义分割笔记(一):基于PaddleSeg使用Transfomer模型对航空遥感图像分割
|
NoSQL MongoDB
mongodb使用like模糊查询
mongodb使用like模糊查询
1932 0
|
Unix Linux Shell
export在linux中的作用
通过对 `export`命令的详细介绍和实际应用示例,可以更好地理解和使用这一命令来管理Linux环境中的变量配置,从而提高系统管理和脚本编写的效率和灵活性。
1411 27
|
Python
Python中的try-except异常处理语句
Python中的try-except异常处理语句
1298 2
|
Linux Shell 开发工具
C++ 的 ini 配置文件读写/注释库 inicpp 用法 [ header-file-only ]
这是一个C++库,名为inicpp,用于读写带有注释的INI配置文件,仅包含一个hpp头文件,无需编译,支持C++11及以上版本。该库提供简单的接口,使得操作INI文件变得容易。用户可通过`git clone`从GitHub或Gitee获取库,并通过包含`inicpp.hpp`来使用`inicpp::iniReader`类。示例代码展示了读取、写入配置项以及添加注释的功能,还提供了转换为字符串、双精度和整型的函数。项目遵循MIT许可证,示例代码可在Linux环境下编译运行。
1934 0
|
NoSQL Linux MongoDB
C++库封装mongodb(跨平台开发)
我的初衷是在Linux平台下只提供动态库和头文件,windows平台下提供静态库和头文件给开发者,这个库mongo-proxy对外提供了一些对mongodb的连接,增删改查,创建索引,聚合等操作的封装,开发者只需要关心接口如何调用,而不需要关心接口是如何实现的,也不需要关心mongo-c-driver的相关依赖,这里我抽象出mongo_proxy类,