GIS | 利用GDAL庫讀寫影像資料
基於Dataset
public CPLErr ReadRaster(int xOff, int yOff, int xSize, int ySize, byte[] buffer, int buf_xSize, int buf_ySize, int bandCount, int[] bandMap, int pixelSpace, int lineSpace, int bandSpace)
int[] dataArray = new int[srcWidth * srcHeight * bandCount];
xOff和yOff是指偏移量,即從影像的左上角起始座標(xOff,yOff)開始讀取資料。
xSize和ySize是指讀取影象資料的行列數,即寬度和高度,單位都是畫素。
Buffer是影象資料快取區域(陣列),要根據檔案型別重新定義 const char* GDALGetDataTypeName(poBand->GetRasterDataType()) 。
buf_xSize和buf_ySize是快取區的大小,預設的GDAL支援重取樣,它們須與buffer申請的大小保持一致,通過這兩個引數可以控制影像的縮放,如果它們小於xSize和ySize就是將原圖縮小,反之如果它們大於xSize和ySize就是將原圖放大。
pixelSpace和lineSpace一般預設取0即可。ReadRaster最後三個引數全是0,預設按照波段順序儲存 。
pixelSpace設定成1,則隔一個畫素點讀取一個畫素點的方式讀取影象。
Ds.ReadRaster(0, 0, srcWidth, srcHeight, dataArray, srcWidth, srcHeight, bandCount, bandArray, 0, 0, 0);
public CPLErr WriteRaster(int xOff, int yOff, int xSize, int ySize, byte[] buffer, int
/// <summary>
/// GDAL柵格轉換為點陣圖
/// </summary>
/// <param name="ds">GDAL Dataset</param>
/// <param name="showRect">顯示區域</param>
/// <param name="bandlist">需要顯示的波段列表</param>
/// <returns>返回Bitmap物件</returns>
public Bitmap GetImage(OSGeo.GDAL.Dataset ds, Rectangle showRect, int[] bandlist)
{
int imgWidth = ds.RasterXSize; //影像寬
int imgHeight = ds.RasterYSize; //影像高
float ImgRatio = imgWidth / (float)imgHeight; //影像寬高比
//獲取顯示控制元件大小
int BoxWidth = showRect.Width;
int BoxHeight = showRect.Height;
float BoxRatio = imgWidth / (float)imgHeight; //顯示控制元件寬高比
//計算實際顯示區域大小,防止影像畸變顯示
int BufferWidth, BufferHeight;
if (BoxRatio >= ImgRatio)
{
BufferHeight = BoxHeight;
BufferWidth = (int)(BoxHeight * ImgRatio);
}
else
{
BufferWidth = BoxWidth;
BufferHeight = (int)(BoxWidth / ImgRatio);
}
//構建點陣圖
Bitmap bitmap = new Bitmap(BufferWidth, BufferHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
if (bandlist.Length == 3) //RGB顯示
{
int[] r = new int[BufferWidth * BufferHeight];
Band band1 = ds.GetRasterBand(bandlist[0]);
band1.ReadRaster(0, 0, imgWidth, imgHeight, r, BufferWidth, BufferHeight, 0, 0); //讀取影象到記憶體
//為了顯示好看,進行最大最小值拉伸顯示
double[] maxandmin1 = { 0, 0 };
band1.ComputeRasterMinMax(maxandmin1, 0);
int[] g = new int[BufferWidth * BufferHeight];
Band band2 = ds.GetRasterBand(bandlist[1]);
band2.ReadRaster(0, 0, imgWidth, imgHeight, g, BufferWidth, BufferHeight, 0, 0);
double[] maxandmin2 = { 0, 0 };
band2.ComputeRasterMinMax(maxandmin2, 0);
int[] b = new int[BufferWidth * BufferHeight];
Band band3 = ds.GetRasterBand(bandlist[2]);
band3.ReadRaster(0, 0, imgWidth, imgHeight, b, BufferWidth, BufferHeight, 0, 0);
double[] maxandmin3 = { 0, 0 };
band3.ComputeRasterMinMax(maxandmin3, 0);
int i, j;
for (i = 0; i < BufferWidth; i++)
{
for (j = 0; j < BufferHeight; j++)
{
int rVal = Convert.ToInt32(r[i + j * BufferWidth]);
rVal = (int)((rVal - maxandmin1[0]) / (maxandmin1[1] - maxandmin1[0]) * 255);
int gVal = Convert.ToInt32(g[i + j * BufferWidth]);
gVal = (int)((gVal - maxandmin2[0]) / (maxandmin2[1] - maxandmin2[0]) * 255);
int bVal = Convert.ToInt32(b[i + j * BufferWidth]);
bVal = (int)((bVal - maxandmin3[0]) / (maxandmin3[1] - maxandmin3[0]) * 255);
Color newColor = Color.FromArgb(rVal, gVal, bVal);
bitmap.SetPixel(i, j, newColor);
}
}
}
else //灰度顯示
{
int[] r = new int[BufferWidth * BufferHeight];
Band band1 = ds.GetRasterBand(bandlist[0]);
band1.ReadRaster(0, 0, imgWidth, imgHeight, r, BufferWidth, BufferHeight, 0, 0);
double[] maxandmin1 = { 0, 0 };
band1.ComputeRasterMinMax(maxandmin1, 0);
int i, j;
for (i = 0; i < BufferWidth; i++)
{
for (j = 0; j < BufferHeight; j++)
{
int rVal = Convert.ToInt32(r[i + j * BufferWidth]);
rVal = (int)((rVal - maxandmin1[0]) / (maxandmin1[1] - maxandmin1[0]) * 255);
Color newColor = Color.FromArgb(rVal, rVal, rVal);
bitmap.SetPixel(i, j, newColor);
}
}
}
return bitmap;
}
讀寫影像資料(基於Band)
public CPLErr ReadRaster(int xOff, int yOff, int xSize, int ySize, byte[] buffer, int buf_xSize, int buf_ySize, int pixelSpace, int lineSpace)