前言
是之前“GDAL转Mat格式”的逆过程。
代码
//作者:山科_xxin
//时间:2017-04-05 21:53:44
//功能:<a href="https://www.ixxin.cn/tag/opencv2gdal/" title="查看更多关于Opencv2GDAL的文章" target="_blank">Opencv2GDAL</a>
//类别:<a href="https://www.ixxin.cn/tag/opencv/" title="查看更多关于Opencv的文章" target="_blank">Opencv</a>,<a href="https://www.ixxin.cn/tag/gdal/" title="查看更多关于GDAL的文章" target="_blank">GDAL</a>
int opencv2gdal(cv::Mat img, const char* fileName)
{
if(img.empty()) // 判断是否为空
return 0;
const int nBandCount=img.channels();
const int nImgSizeX=img.cols;
const int nImgSizeY=img.rows;
//cout<<nBandCount<<endl;
GDALAllRegister();
GDALDataset *poDataset; //GDAL数据集
GDALDriver *poDriver; //驱动,用于创建新的文件
poDriver = GetGDALDriverManager()->GetDriverByName("GTiff");
if(poDriver == NULL)
return 0;
poDataset=poDriver->Create(fileName,nImgSizeX,nImgSizeY,nBandCount,
GDT_Byte,NULL);
// 循环写入文件
GDALRasterBand *pBand = NULL;
//uchar *ppafScan = new uchar[nImgSizeX*nImgSizeY];
int nl = nImgSizeY;
int nc = nImgSizeX;
vector<Mat> channels;
split(img,channels);
Mat tmpMat;
for(int n = 1;n<=nBandCount;n++)
{
pBand = poDataset->GetRasterBand(n);
uchar *ppafScan = new uchar[nImgSizeX*nImgSizeY];
tmpMat = channels.at(n-1).clone();
if(tmpMat.isContinuous())
{
//cout<<"0"<<endl;
nc = nc*nl;
for(int i = 0;i<nc;i++)
{
ppafScan = tmpMat.ptr<uchar>(0);
//ppafScan[i] = tmpMat.ptr<uchar>(0)[i];
}
}
/*
if(img.isContinuous())
{
nc = nl*nc;
n1 = 1;
}
for(int r = 0;r<n1;r++)
{
int tmpI = r*nImgSizeX;
float *p = img.ptr<float>(r);
for(int c = 0;c<nc;c++)
{
ppafScan[tmpI+c] = p[c];
}
}
*/
pBand->RasterIO(GF_Write,0,0,nImgSizeX,nImgSizeY,
ppafScan,nImgSizeX,nImgSizeY,GDT_Byte,0,0);
tmpMat.release();
//ppafScan = NULL;
}
//delete []ppafScan;
//ppafScan = NULL;
GDALClose(poDataset);
return 0;
}
结果:

存在一个问题就是颜色不完全匹配。
参考文章
http://www.tuicool.com/articles/ARJ3uab



