2·如何实现加载影像

本篇文章旨在整理笔者踩过的一些坑,方便以后翻阅,同时帮助来访者解决问题。

1. GDAL的注册

public frmMain()
{
    InitializeComponent();
    //注册GDAL(compulsory request)
    OSGeo.GDAL.Gdal.AllRegister();
}

2.界面按钮的(Name)设置(代码中需保持一致)

2·如何实现加载影像

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;
            }
        }

      

笔者同样初窥门径,文章内容简陋与不实之处,请各位网友批评指正!

上一篇:Cypress系列(101)- intercept() 命令详解


下一篇:2020-11-25