利用GDAL的RasterIO函数可以从原图中抠出一块矩形图片。如下面的代码:
pSrcDS->GetRasterBand(1)->RasterIO(GF_Read, 矩形左上角到图片左边的距离(单位像素)iStartX,
矩形左上角到图片上边的距离(单位像素)iStartY, 矩形宽度iWidth, 矩形高度iHeight,
存储数据的首地址pDataBuff, 地址宽度iWidth, 地址高度iHeight,
数据类型,如GDT_Byte, 0, 0);
示例代码将从一块3色的jpg图片中,提取第一个波段里的一块矩形(300乘300,矩形的左上角距离原图左边和上边的距离分别是600像素)数据,然后保存到一个名为part.tif的图片中:
#include "stdafx.h"
#include "gdal_priv.h"
#pragma comment(lib, "gdal_i.lib")
int _tmain(int argc, _TCHAR* argv[])
{
GDALAllRegister();
//读取图片的一部分
GDALDataset* pSrcDS=(GDALDataset*)GDALOpen("C:\\ziji\\yaogan.jpg", GA_ReadOnly);
unsigned char * pDataBuff = new unsigned char[300 * 300];
pSrcDS->GetRasterBand(1)->RasterIO(GF_Read, 600, 600, 300, 300, pDataBuff, 300, 300, GDT_Byte, 0, 0);
GDALClose(pSrcDS);
//写入新文件
GDALDriver * poDriver = GetGDALDriverManager()->GetDriverByName("GTiff");
GDALDataset* pDstDS = poDriver->Create("part.tif", 300, 300, 1, GDT_Byte, NULL);
pDstDS->GetRasterBand(1)->RasterIO(GF_Write, 0, 0, 300, 300, pDataBuff, 300, 300, GDT_Byte, 0, 0);
GDALClose(pDstDS);
delete [] pDataBuff;
return 0;
}
效果:
被截取的矩形部分大致位于红色圆圈包括部分。右方是截取结果。