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