Wechat: yu389741| Email: gisdqy@163.com

Shop:https://www.giserdqy.com/shop

基于GDAL实现JPEG图片的创建


本文作用:利用GDAL库函数创建图像时,一般会用到GDALDriverCreate()函数,但是Create()函数不支持JPEGPNG等格式,不过,CreateCopy()支持这些格式,所以根据已有的图像数据,不能直接创建jpgpng格式的图像,而要借助GDALMEM内存文件,来创建他们。

本文主要介绍借助GDALMEM内存文件,创建jpgpng格式的图像(以jpg为例)

1>、借助MEM内存创建:

  1. int main()
  2. {
  3.        GDALAllRegister();
  4.        GDALDataset *poSrcDS = (GDALDataset*)GDALOpen(“C:\\Users\\hong\\Desktop\\lena.tif”,GA_ReadOnly);
  5.        if(poSrcDS==NULL)
  6.        {
  7.               printf(打开图像失败!);
  8.               return 0;
  9.        }
  10.  
  11.        //获取图像的基本信息,并把数据读入缓冲区间
  12.        CString OutFilename(“C:\\Users\\hong\\Desktop\\123.jpg”);
  13.        int m_Width = poSrcDS->GetRasterXSize();
  14.        int m_Height = poSrcDS->GetRasterYSize();
  15.        unsigned char *buffer = new unsigned char[m_Width*m_Height]; //存储数据的缓冲区
  16.        GDALRasterBand *poSrcDSRasterBand = poSrcDS->GetRasterBand(1);
  17.        CPLErr err = poSrcDSRasterBand->RasterIO(GF_Read,0,0,m_Width,m_Height,buffer,m_Width,m_Height,GDT_Byte,0, 0);
  18.        if(err != CE_None)
  19.        {
  20.               printf(读取图像数据失败!);
  21.               return 0;
  22.        }
  23.  
  24.        /* 以下程序是生成JPG的过程,上面的程序只为获得创建过程中的一些参数,如:图像的高、宽及图像数据*/
  25.  
  26.        //把数据保存到临时文件MEM
  27.        GDALDriver *pDriverMEM = GetGDALDriverManager()->GetDriverByName(“MEM”);
  28.        GDALDataset *pOutMEMDataset = pDriverMEM->Create(“”, m_Width,m_Height,1,GDT_Byte,NULL);
  29.        GDALRasterBand *pOutMEMRasterBand = pOutMEMDataset->GetRasterBand(1);
  30.        err = pOutMEMRasterBand->RasterIO(GF_Write,0,0,m_Width,m_Height,buffer,m_Width,m_Height,GDT_Byte,0, 0);
  31.        if(err != CE_None)
  32.        {
  33.               printf(写图像数据失败!);
  34.               return 0;
  35.        }
  36.  
  37.        //以创建复制的方式,生成jpg文件
  38.        GDALDriver *pDriverJPG = GetGDALDriverManager()->GetDriverByName(“JPEG”);
  39.        pDriverJPG->CreateCopy(OutFilename,pOutMEMDataset,TRUE,0,0,0); //创建jpg文件
  40.  
  41.        return 0;
  42. }

注:用RasterIO时,注意图像文件的数据类型,根据需要更改。

2>、利用C\C++ 函数创建:

除了利用MEM内存创建外,还可以借助C\C++的一些函数,先用GDALDriver类的Create()函数生成.tif文件,然后通过更改文件名,来实现把.tif格式转化为所需格式。

  1. CString oldname = OutimgName; 
  2. OutimgName.Replace(“.tif”,“.jpg”);//更改文件名后缀,改成.jpg格式
  3. CString newname = OutimgName;
  4. remove(newname);  //如果已有该jpg文件,则移除,以便产生新的,否则不能替换文件名
  5. rename(oldname,newname);//替换文件名

转载自:https://blog.csdn.net/xueyuan1024/article/details/82220923