利用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;
}
效果:
被截取的矩形部分大致位於紅色圓圈包括部分。右方是截取結果。