本篇文章旨在整理笔者踩过的一些坑,方便以后翻阅,同时帮助来访者解决问题。
1. GDAL的注册
public frmMain()
{
InitializeComponent();
//注册GDAL(compulsory request)
OSGeo.GDAL.Gdal.AllRegister();
}
2.界面按钮的(Name)设置(代码中需保持一致)
3.算法思路
①弹出打开文件对话框—获取文件路径
②采用GDAL库Open影像,并赋值给OSGeo.GDAL.Dataset类的对象
③获取影像的宽和高
④采用循环的形式获取波段
4.定义变量及解释
①存放选择文件路径
string CurrentFilepath = "";
②用来存放获取的影像内容
OSGeo.GDAL.Dataset Currentds = null;
注意:
影像存放类Gdal.Dataset与Form.DataSet不同,字面区别在于S的大小写。
5. 弹出打开文件对话框—获取文件路径
5.1实例化OpenFileDialog
OpenFileDialog ofd = new OpenFileDialog();
5.2设置过滤器
ofd.Filter = "Tiff文件|*.tif|" +
"Erdas img文件|*.img|" +
"Bmp文件|*.bmp|" +
"所有文件|*.* ";
5.3 检查是否弹出成功
if (ofd.ShowDialog()==DialogResult.OK)
{
}
5.4 获取影像文件路径
CurrentFilepath = ofd.FileName;
5. 采用GDAL库Open影像,并赋值给OSGeo.GDAL.Dataset类的对象
①判断影像文件路径是否为空
if (CurrentFilepath == "")
{
MessageBox.Show("当前文件名为空!");
return;
}
②获取影像内容
Currentds = Gdal.Open(CurrentFilepath, Access.GA_ReadOnly);
注意:
Gdal.Open的参数为文件路径和数据库读取类型(只读或者更新,此时只需要加载影像,因而选择只读)
③判断影像内容是否为空
if (Currentds == null)
{
MessageBox.Show("文件内容为空!");
return;
}
6. 获取影像的宽和高
label_Width.Text = Currentds.RasterXSize.ToString();
label_Height.Text = Currentds.RasterYSize.ToString();
7. 采用循环的形式获取波段
①获取波段信息
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中获取的波段。
8.完整代码
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;
}
}
笔者同样初窥门径,文章内容简陋与不实之处,请各位网友批评指正!