Wechat: yu389741| Email: gisdqy@163.com

Shop:https://www.giserdqy.com/shop

遥感图像处理 | 利用GDAL打开图像并读取图像元数据(波段)信息(C#)


事前准备:

编译并配置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控件进行显示
        }
    }

            

            

 

转载自:https://blog.csdn.net/weixin_41340063/article/details/82711998