基于GDAL实现JPEG图片的创建
本文作用:利用GDAL库函数创建图像时,一般会用到GDALDriver类Create()函数,但是Create()函数不支持JPEG、PNG等格式,不过,CreateCopy()支持这些格式,所以根据已有的图像数据,不能直接创建jpg、png格式的图像,而要借助GDAL的MEM内存文件,来创建他们。
本文主要介绍:借助GDAL的MEM内存文件,创建jpg、png格式的图像(以jpg为例)
1>、借助MEM内存创建:
- int main()
- {
- GDALAllRegister();
- GDALDataset *poSrcDS = (GDALDataset*)GDALOpen(“C:\\Users\\hong\\Desktop\\lena.tif”,GA_ReadOnly);
- if(poSrcDS==NULL)
- {
- printf(“打开图像失败!“);
- return 0;
- }
- //获取图像的基本信息,并把数据读入缓冲区间
- CString OutFilename(“C:\\Users\\hong\\Desktop\\123.jpg”);
- int m_Width = poSrcDS->GetRasterXSize();
- int m_Height = poSrcDS->GetRasterYSize();
- unsigned char *buffer = new unsigned char[m_Width*m_Height]; //存储数据的缓冲区
- GDALRasterBand *poSrcDSRasterBand = poSrcDS->GetRasterBand(1);
- CPLErr err = poSrcDSRasterBand->RasterIO(GF_Read,0,0,m_Width,m_Height,buffer,m_Width,m_Height,GDT_Byte,0, 0);
- if(err != CE_None)
- {
- printf(“读取图像数据失败!“);
- return 0;
- }
- /* 以下程序是生成JPG的过程,上面的程序只为获得创建过程中的一些参数,如:图像的高、宽及图像数据*/
- //把数据保存到临时文件MEM
- GDALDriver *pDriverMEM = GetGDALDriverManager()->GetDriverByName(“MEM”);
- GDALDataset *pOutMEMDataset = pDriverMEM->Create(“”, m_Width,m_Height,1,GDT_Byte,NULL);
- GDALRasterBand *pOutMEMRasterBand = pOutMEMDataset->GetRasterBand(1);
- err = pOutMEMRasterBand->RasterIO(GF_Write,0,0,m_Width,m_Height,buffer,m_Width,m_Height,GDT_Byte,0, 0);
- if(err != CE_None)
- {
- printf(“写图像数据失败!“);
- return 0;
- }
- //以创建复制的方式,生成jpg文件
- GDALDriver *pDriverJPG = GetGDALDriverManager()->GetDriverByName(“JPEG”);
- pDriverJPG->CreateCopy(OutFilename,pOutMEMDataset,TRUE,0,0,0); //创建jpg文件
- return 0;
- }
注:用RasterIO时,注意图像文件的数据类型,根据需要更改。
2>、利用C\C++ 函数创建:
除了利用MEM内存创建外,还可以借助C\C++的一些函数,先用GDALDriver类的Create()函数生成.tif文件,然后通过更改文件名,来实现把.tif格式转化为所需格式。
- CString oldname = OutimgName;
- OutimgName.Replace(“.tif”,“.jpg”);//更改文件名后缀,改成.jpg格式
- CString newname = OutimgName;
- remove(newname); //如果已有该jpg文件,则移除,以便产生新的,否则不能替换文件名
- rename(oldname,newname);//替换文件名
转载自:https://blog.csdn.net/xueyuan1024/article/details/82220923