本篇文章旨在整理笔者踩过的一些坑,方便以后翻阅,同时帮助来访者解决问题。
public frmMain() { InitializeComponent(); //注册GDAL(compulsory request) OSGeo.GDAL.Gdal.AllRegister(); }
①弹出打开文件对话框—获取文件路径
②采用GDAL库Open影像,并赋值给OSGeo.GDAL.Dataset类的对象
③获取影像的宽和高
④采用循环的形式获取波段
①存放选择文件路径
string CurrentFilepath = "";
②用来存放获取的影像内容
OSGeo.GDAL.Dataset Currentds = null;
注意:
影像存放类Gdal.Dataset与Form.DataSet不同,字面区别在于S的大小写。
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Tiff文件|*.tif|" + "Erdas img文件|*.img|" + "Bmp文件|*.bmp|" + "所有文件|*.* ";
if (ofd.ShowDialog()==DialogResult.OK) { }
CurrentFilepath = ofd.FileName;
①判断影像文件路径是否为空
if (CurrentFilepath == "") { MessageBox.Show("当前文件名为空!"); return; }
②获取影像内容
Currentds = Gdal.Open(CurrentFilepath, Access.GA_ReadOnly);
注意:
Gdal.Open的参数为文件路径和数据库读取类型(只读或者更新,此时只需要加载影像,因而选择只读)
③判断影像内容是否为空
if (Currentds == null) { MessageBox.Show("文件内容为空!"); return; }
label_Width.Text = Currentds.RasterXSize.ToString();
label_Height.Text = Currentds.RasterYSize.ToString();
①获取波段信息
for (int i=0;i<Currentds.RasterCount;i++) { BandShow_R.Items.Add("Band"+(i+1)); BandShow_G.Items.Add("Band" + (i + 1)); BandShow_B.Items.Add("Band" + (i + 1)); }
②设置默认波段
BandShow_R.SelectedIndex = 0; BandShow_G.SelectedIndex = 0; BandShow_B.SelectedIndex = 0;
③清除波段
BandShow_R.Items.Clear(); BandShow_G.Items.Clear(); BandShow_B.Items.Clear();
注意:
每一次执行加载图像,波段都会被加载在ControlBox中,因此会出现许多不存在或重复的波段,因而需要在加载影像执行之初,消除ControlBox中获取的波段。
private void btnLoadImage_Click(object sender, EventArgs e) { BandShow_R.Items.Clear(); BandShow_G.Items.Clear(); BandShow_B.Items.Clear(); //(1) OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "Tiff文件|*.tif|" + "Erdas img文件|*.img|" + "Bmp文件|*.bmp|" + "所有文件|*.* "; if (ofd.ShowDialog()==DialogResult.OK) { CurrentFilepath = ofd.FileName; if (CurrentFilepath == "") { MessageBox.Show("当前文件名为空!"); return; } try { Currentds = Gdal.Open(CurrentFilepath, Access.GA_ReadOnly); if (Currentds == null) { MessageBox.Show("文件内容为空!"); return; } } catch(Exception exc) { MessageBox.Show(exc.Message); return; } label_Width.Text = Currentds.RasterXSize.ToString(); label_Height.Text = Currentds.RasterYSize.ToString(); for (int i=0;i<Currentds.RasterCount;i++) { BandShow_R.Items.Add("Band"+(i+1)); BandShow_G.Items.Add("Band" + (i + 1)); BandShow_B.Items.Add("Band" + (i + 1)); } BandShow_R.SelectedIndex = 0; BandShow_G.SelectedIndex = 0; BandShow_B.SelectedIndex = 0; } }
笔者同样初窥门径,文章内容简陋与不实之处,请各位网友批评指正!