GDAL创建JPG格式图像

说明:
利用GDAL库函数创建图像时,一般会用到GDALDriver类Create()函数,但是Create()函数不支持JPEG、PNG等格式,不过,CreateCopy()支持这些格式,所以根据已有的图像数据,不能直接创建jpg、png格式的图像,而要借助GDAL的MEM内存文件,来创建他们。
本文主要介绍:借助GDAL的MEM内存文件,创建jpg、png格式的图像(以jpg为例)。
【GDAL创建JPG格式图像】一、借助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时,注意图像文件的数据类型,根据需要更改。
二、利用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); //替换文件名








    推荐阅读