事前準備:
編譯並配置GDAL庫。
函數和方法說明:
public static Dataset Open(string utf8_path, Access eAccess)
從指定路徑讀取柵格數據。第一個參數是柵格數據的路徑,第二個參數是打開數據的模式,GA_ReadOnly表示以只讀方式打開,GA_Update表示以讀寫方式打開。該函數返回一個Dataset對象,gdal用Dataset對象爲所有柵格數據提供統一的訪問接口。Dataset中包含1個或多個band,還包含了柵格數據的大小、nodatavalue等信息。
OSGeo.GDAL.Gdal.AllRegister(); // 初始化gdal庫
OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); //設置爲UTF-8編碼
OSGeo.GDAL.Dataset dataset = OSGeo.GDAL.Gdal.Open(ofd.FileName, OSGeo.GDAL.Access.GA_ReadOnly);
public class Dataset
柵格影像信息
public int RasterCount { get; }
public int RasterXSize { get; }
public int RasterYSize { get; }
int width = dataset.GetRasterXSize(); //圖像寬
int height = dataset.GetRasterYSize(); //圖像高
int bandCount = dataset.GetRasterCount(); // 獲取柵格數據的點的數量
public class Band
讀取波段信息
public DataType DataType { get; }
public ColorTable GetColorTable();
public Band GetMaskBand();
public int GetMaskFlags();
public Band GetOverview(int i);
public int GetOverviewCount();
獲取統計值
public void GetMaximum(out double val, out int hasval);//最小值
public void GetMinimum(out double val, out int hasval);//最大值
public void GetNoDataValue(out double val, out int hasval); //獲取沒有數據的點
double val; int hasval;
public void GetMaximum(out val, out hasval);//最小值
public void GetMinimum(out val, out hasval);//最大值
public void GetNoDataValue(out val, out hasval); //獲取沒有數據的點
public void GetGeoTransform(double[] argout);
argout爲仿射變換參數。一般來說,仿射座標轉換就是通過幾個值來進行柵格框架到地理框架的映射。GDAL中的仿射變換參數包括6個值,可以使用這6個參數來計算每個像素點的座標:
Xgeo = GT(0) + Xpixel*GT(1) + Yline*GT(2)
Ygeo = GT(3) + Xpixel*GT(4) + Yline*GT(5)
其中Xgeo, Ygeo是地理座標, Xpixel, Yline是像素座標。GT是係數數組。若影像正上爲北方向,GT(2)和GT(4),表示圖像旋轉系數,對於一般圖像這兩個的係數爲零,GT(1)爲像素寬度,GT(5)爲像素高度,一般這兩個值相等符號相反。(GT(0),GT(3))位置是光柵左上角像素的左上角。 上面所說的點/線座標系是從左上角(0,0)點到右下角,也就是座標軸從左到右增長,從上到下增長的座標系。
處理過程:
1,在要使用gdal的文件頭部加上如下命名空間的聲明:
using OSGeo.GDAL;
3.讀取代碼可以將圖片轉化爲Bitmap格式顯示 https://blog.csdn.net/weixin_41340063/article/details/82733728
4.主函數讀取代碼如下:
private void Form1_Load(object sender, EventArgs e)
{
OSGeo.GDAL.Gdal.AllRegister();
OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
}
private void 打開ToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = @"所有文件|*.*";
ofd.Title = "打開圖片";
ofd.ShowDialog();
string filename = ofd.FileName;
if(filename ==null)
{
MessageBox.Show("影像路徑不能爲空");
return;
}
OSGeo.GDAL.Dataset ds = OSGeo.GDAL.Gdal.Open(ofd.FileName, OSGeo.GDAL.Access.GA_ReadOnly);//只讀方式打開
//顯示影像
Rectangle pictureRect = new Rectangle();
pictureRect.X = 0;
pictureRect.Y = 0;
pictureRect.Width = this.pictureBox1.Width;
pictureRect.Height = this.pictureBox1.Height;
int[] disband = new int[3] { 1,2,3 };
Bitmap bitmap = CommonClass.GetImage(ds, pictureRect, disband); ; //遙感影像構建位圖
BITMAP = bitmap;
pictureBox1.Image = bitmap; //將位圖傳遞給PictureBox控件進行顯示
}
}