基于C#和DGAL包实现栅格影像的读取和显示

  • GDAL包提供了诸多处理栅格影像的方法,本文就将详细介绍基于GDAL包和C#语言如何实现栅格影像的读取和显示,这种实现是在VS2015的开发环境中完成。
  • 要像实现栅格影像数据的读取和显示,首先得弄清楚栅格影像的数据结构,栅格影像主要分为两类,一类是灰度影像,一类是彩色影像。但是这两类影像有一个共同的特点,他们都是由像元构成,每一个像元由像元值表示该像元的属性,不过灰度影像的像元属性有一个值(0-255)确定,而彩色影像一般是由三个值确定,分别对听R,G,B三类原色的值(0-255),就是说只要我们知道了每一个像元对应的属性值,那么就可以实现该影像的显示或者其他操作。
  • 由于GDAL是一个包,因此在正式开始之前需要配置环境,具体配置方法我已经发布过相应的博客,大家如果在这里有问题的话可以参考下面的连接
  • 到这里就假装认为大家配置环境都木有问题了啊,咱们就开始码代码了,首先就是引用包的基本操作,得获取包的相应许可,也就是下面这句话啦,这句话是很简单,但是这是添加的引用的情况下,大家配置好环境后一定要添加相应的引用,接下来本文会附上本文代码所用到的所有引用,供大家参考。
  • 好了不说废话了,一句句解释太累了,直接上代码吧,下面是第一部分,环境的初始化,包括栅格文件的选择和初始环境的配置,这种配置主要是针对pictrueBox控件,该控件将用来显示栅格影像。代码中有两个函数,分别是initial()和ReadImage(),initial()大家不用在意,这个没么之用,只是我个人觉得窗体打开后pictrueBox对应的区域一片空白有点不爽,所以写了一个函数把pictrueBox对应的image也初始化,代码我后面也会粘上去;而ReadImage()就重要了,包括了读取栅格影像的具体代码,主要包括三个部分,分别是读取影像的相关信息、对图像进行缩放(为了防止图像变形,需要按照影像的宽高比对缓冲区的宽高比进行调整)、读取影像数据,其中读取影像数据包括两个部分,即灰度影像的像元值读取和彩色影像的像元值读取。
  • 下面是 ReadImage()函数对应的代码。
  • 以上就是所有的关键代码了,哦,对了,还有一个initial()方法对应的代码块,代码如下。
  • 下面附几张程序的运行效果图吧。
  • 本文对应程序的所有文档已经全部上传到csdn网站上,如果大家有需求的话请自行下载(程序亲测有用),不过还是希望大家自己完成,个人觉得我这个小程序不值5个积分,但是我也么的办法,链接见下。

GDAL包提供了诸多处理栅格影像的方法,本文就将详细介绍基于GDAL包和C#语言如何实现栅格影像的读取和显示,这种实现是在VS2015的开发环境中完成。

要像实现栅格影像数据的读取和显示,首先得弄清楚栅格影像的数据结构,栅格影像主要分为两类,一类是灰度影像,一类是彩色影像。但是这两类影像有一个共同的特点,他们都是由像元构成,每一个像元由像元值表示该像元的属性,不过灰度影像的像元属性有一个值(0-255)确定,而彩色影像一般是由三个值确定,分别对听R,G,B三类原色的值(0-255),就是说只要我们知道了每一个像元对应的属性值,那么就可以实现该影像的显示或者其他操作。

由于GDAL是一个包,因此在正式开始之前需要配置环境,具体配置方法我已经发布过相应的博客,大家如果在这里有问题的话可以参考下面的连接

GDAL配置

到这里就假装认为大家配置环境都木有问题了啊,咱们就开始码代码了,首先就是引用包的基本操作,得获取包的相应许可,也就是下面这句话啦,这句话是很简单,但是这是添加的引用的情况下,大家配置好环境后一定要添加相应的引用,接下来本文会附上本文代码所用到的所有引用,供大家参考。

Gdal.AllRegister();
//引用
using System;
using System.Drawing;
using System.Windows.Forms;
using OSGeo.GDAL;

好了不说废话了,一句句解释太累了,直接上代码吧,下面是第一部分,环境的初始化,包括栅格文件的选择和初始环境的配置,这种配置主要是针对pictrueBox控件,该控件将用来显示栅格影像。代码中有两个函数,分别是initial()和ReadImage(),initial()大家不用在意,这个没么之用,只是我个人觉得窗体打开后pictrueBox对应的区域一片空白有点不爽,所以写了一个函数把pictrueBox对应的image也初始化,代码我后面也会粘上去;而ReadImage()就重要了,包括了读取栅格影像的具体代码,主要包括三个部分,分别是读取影像的相关信息、对图像进行缩放(为了防止图像变形,需要按照影像的宽高比对缓冲区的宽高比进行调整)、读取影像数据,其中读取影像数据包括两个部分,即灰度影像的像元值读取和彩色影像的像元值读取。

            initial();//文件路径string fileName = "";OpenFileDialog openFile = new OpenFileDialog();openFile.Filter = "所有文件|*.*|Tiff文件|*.tif|Erdas img文件|*.img|Bmp文件|*.bmp|jpeg文件|*.jpg";if (openFile.ShowDialog() == DialogResult.OK){fileName = openFile.FileName;}else{MessageBox.Show("影像路径不能为空","注意",MessageBoxButtons.OKCancel,MessageBoxIcon.Information);return;}textBox1.Text = fileName;//创建DatasetGdal.AllRegister();Dataset ds = null;try{ds = Gdal.Open(fileName, Access.GA_ReadOnly);}catch (Exception ex){MessageBox.Show("打开影像失败"+ex.Message);}if (ds == null){MessageBox.Show("影像无效");return;}//创建包络矩形Rectangle rec = new Rectangle();rec.Width = this.pictureBox1.Width;rec.Height = this.pictureBox1.Height;//调用ReadImage方法获取图像并显示Bitmap map = ReadImage(ds, rec);pictureBox1.Image = map;

下面是 ReadImage()函数对应的代码。

            #region 获取图像信息int imageWidth = ds.RasterXSize;int imageHeight = ds.RasterYSize;float imgRatio = imageWidth / (float)imageHeight;//图像颜色模式int model;model = ds.RasterCount;double[] dd = new double[4];ds.GetGeoTransform(dd);string prj = ds.GetProjection();string str = string.Format("波段数目:{0}\n行数:{1};列数:{2}\n坐标参考:{3},{4},{5},{6}\n", ds.RasterCount, ds.RasterXSize, ds.RasterYSize, dd[0], dd[1], dd[2], dd[3]);str += prj + "\n";for (int i = 1; i <= ds.RasterCount; ++i){OSGeo.GDAL.Band band = ds.GetRasterBand(i);str += "波段" + i + ":" + band.DataType.ToString();}infoText.Text = str;#endregion#region 对图像进行缩放//依据矩形尺寸设置buffer的尺寸int boxWidth = rec.Width;int boxHeight = rec.Height;float boxRatio = boxWidth / (float)boxHeight;int bufferHeight, bufferWidth;if (imgRatio >= boxRatio){bufferWidth = boxWidth;bufferHeight = (int)(boxWidth / imgRatio);}else{bufferHeight = boxHeight;bufferWidth = (int)(boxHeight * imgRatio);}#endregionBitmap map = new Bitmap(bufferWidth, bufferHeight,System.Drawing.Imaging.PixelFormat.Format24bppRgb);#region 读取图像波段数据//如果图像颜色模式为灰度if (model == 1){Band band1 = ds.GetRasterBand(1);double[] maxmin1 = { 0, 0 };band1.ComputeRasterMinMax(maxmin1, 0);int[] info = new int[bufferHeight * bufferWidth];band1.ReadRaster(0, 0, imageWidth,imageHeight, info, bufferWidth, bufferHeight, 0, 0);int i, j;for (i = 0; i < bufferHeight; i++)for (j = 0; j < bufferWidth; j++){int val = info[i * bufferWidth + j];val = (int)(((val - maxmin1[0]) / (maxmin1[1] - maxmin1[0])) * 255);Color newColor = Color.FromArgb(val, val, val);map.SetPixel(j, i, newColor);}}//如果图像颜色模式为彩色if (model != 1){Band band1 = ds.GetRasterBand(1);double[] maxmin1 = { 0, 0 };band1.ComputeRasterMinMax(maxmin1, 0);int[] r = new int[bufferHeight * bufferWidth];band1.ReadRaster(0, 0, imageWidth,imageHeight, r, bufferWidth, bufferHeight, 0, 0);Band band2 = ds.GetRasterBand(2);double[] maxmin2 = { 0, 0 };band2.ComputeRasterMinMax(maxmin2, 0);int[] g = new int[bufferHeight * bufferWidth];band2.ReadRaster(0, 0, imageWidth,imageHeight, g, bufferWidth, bufferHeight, 0, 0);Band band3 = ds.GetRasterBand(3);double[] maxmin3 = { 0, 0 };band3.ComputeRasterMinMax(maxmin3, 0);int[] b = new int[bufferHeight * bufferWidth];band3.ReadRaster(0, 0, imageWidth,imageHeight, b, bufferWidth, bufferHeight, 0, 0);int i, j;for (i = 0; i < bufferHeight; i++)for (j = 0; j < bufferWidth; j++){int rval = r[i * bufferWidth + j];rval = (int)(((rval - maxmin1[0]) / (maxmin1[1] - maxmin1[0])) * 255);int gval = g[i * bufferWidth + j];gval = (int)(((gval - maxmin2[0]) / (maxmin2[1] - maxmin2[0])) * 255);int bval = b[i * bufferWidth + j];bval = (int)(((bval - maxmin3[0]) / (maxmin3[1] - maxmin3[0])) * 255);Color newColor = Color.FromArgb(rval, gval, bval);map.SetPixel(j, i, newColor);}}return map;#endregion

以上就是所有的关键代码了,哦,对了,还有一个initial()方法对应的代码块,代码如下。

            int xSize = this.pictureBox1.Width;int ySize = this.pictureBox1.Height;Bitmap map = new Bitmap(xSize, ySize, System.Drawing.Imaging.PixelFormat.Format24bppRgb);for (int i = 0; i < xSize; i++)for (int j = 0; j < ySize; j++){Random rd = new Random((int)DateTime.Now.Ticks);Color newColor = Color.FromArgb(rd.Next(0,255), rd.Next(0, 255), rd.Next(0, 255));map.SetPixel(i, j, newColor);}pictureBox1.Image = map;

下面附几张程序的运行效果图吧。



本文对应程序的所有文档已经全部上传到csdn网站上,如果大家有需求的话请自行下载(程序亲测有用),不过还是希望大家自己完成,个人觉得我这个小程序不值5个积分,但是我也么的办法,链接见下。

基于GDAL和C#语言读取栅格影像

基于C#和DGAL包实现栅格影像的读取和显示相关推荐

  1. 【ArcGIS风暴】ArcGIS10.6获取栅格影像边界范围的三种方法案例详解

    基于ArcGIS平台有多种办法可以提取栅格影像边界,常见的方法有3种: 栅格范围(Raster Domain) 栅格转面(Raster to Polygon) 创建轮廓(BuildFootprints ...

  2. python矢量裁剪栅格代码_Python中使用面状矢量裁剪栅格影像,并依据Value值更改矢量属性...

    本文整体思路:在Python中使用Geopandas库,依次读取shp文件的每一个面状要素,获取其空间边界信息并裁剪对应的栅格影像,计算所裁剪影像Value值的众数,将其设置为对应面状要素的NewTY ...

  3. 将栅格影像转换为CAD/GIS矢量的3种方法

    原文发布时间:2017/11/22  12:58:11 从图像中提取矢量要素或"栅格矢量化"涉及将栅格像素组转换为多边形.这是GIS和CAD工作流程的常见场景,也是一个具有挑战性的 ...

  4. sar偏移量追踪技术_论文推荐 | 吴文豪:基于几何配准的多模式SAR影像配准及其误差分析...

    <测绘学报> 构建与学术的桥梁 拉近与权威的距离 基于几何配准的多模式SAR影像配准及其误差分析 吴文豪1, 张磊2, 李陶3, 龙四春1, 段梦4, 周志伟5, 祝传广1, 蒋廷臣61. ...

  5. 基于SRCNN的表情包超分辨率(附tensorflow实现)

    基于SRCNN的表情包超分辨率(附tensorflow实现) 2018年02月25日 14:04:05

  6. 【ArcGIS遇上Python】ArcGIS批量处理栅格影像(NDVI)归一化完整案例代码

    文章<ArcGIS栅格影像(NDVI)归一化处理的两种方法精解>详细介绍了ArcGIS中进行NDVI影像归一化处理的两种方法,但是无法批量进行,本文就放大招用Python实现批量NDVI归 ...

  7. springboot基于mybatis扫描jar包中的controller、service、dao、xml

    springboot基于mybatis扫描jar包中的controller.service.dao.xml 最近有这样的需求,是将某个业务模块接口,比如新闻的接口模块 作为一个公共固定的模块,整个包括 ...

  8. Java抓包分析四(基于jnetpcap进行抓包)——分析Http请求数据包

    在上篇文章中Java抓包分析三(基于jnetpcap进行抓包)--抓取Http请求数据包,我们讲解了TCP三次握手的过程和如何抓取Http数据包,但是我们并没有进行一个数据分析,接下来这篇文章我们将要 ...

  9. 基于python中jieba包的中文分词中详细使用(一)

    文章目录 基于python中jieba包的中文分词中详细使用(一) 01.前言 02.jieba的介绍 02.1 What 02.2特点 02.3安装与使用 02.4涉及到的算法 03.主要功能 03 ...

  10. ArcGIS中矢量裁剪栅格影像及影像合并【附练习数据下载】

    关于栅格影像数据的裁剪跟合并我们之前发过很多相关教程,工作中小助手经常用的软件是ArcGIS和Global Mapper 关于Global Mapper相关裁切技巧大家可以看之前发过的一篇→Globa ...

最新文章

  1. HDU 3033 I love sneakers! (分组背包变形)
  2. JZOJ__Day 2:【普及模拟】串
  3. ZooKeeper自定义数据日志目录
  4. C#内存泄露与资源释放 经验总结
  5. IIS 6.0 访问aspx页面出现404错误
  6. 从结构体、内存池初始化到申请释放,详细解读鸿蒙轻内核的动态内存管理
  7. html5 火焰效果图,css3火焰文字特效
  8. OpenAI升级Codex,直接将书面语言转为计算机代码;区块链网站被黑客偷走6亿美元加密货币|极客头条...
  9. python写爬虫4-多线程爬虫(采集58出租房信息)_python实现多线程爬虫
  10. Android中文乱码彻底解决
  11. [转载] Python numpy insert()、 delete()、append()函数的用法
  12. win10里面的linux可以分屏吗,Win10上下分屏怎么弄 教你让Win10上下分屏的方法
  13. 时间对于程序员的价值,以及如何高效地利用时间,同时划分下勤奋度的等级
  14. 苹果6换屏多钱_苹果手机屏幕碎了怎么办?维修更换要多少钱
  15. 242. 有效的字母异位词 349. 两个数组的交集
  16. Papers with Code一个查找论文和对应代码的神器
  17. oracle 建索引 00054,ora-00054 表被lock导致资源忙等待不能操作案例
  18. CSS_变换(transform)
  19. 后疫情时代,用吃增强身体这座“城防工事”
  20. umc18mmrf安装,CDB转OA,使用Cadence VIrtuoso进行芯片设计

热门文章

  1. python设置字符_Python基础教程 将字符串格式设置功能用于字典
  2. fanuc机器人编程手册_FANUC机器人示教编程:信号立即输出附加指令功能介绍与使用方法...
  3. java 发送 json数据_Java web中怎样取得Android通过post发送的json数据
  4. mysql导入数据库没创建表_mysqldump不会创建表或导入任何数据
  5. long 雪花算法_为什么 MySQL 不推荐使用 uuid 或者雪花 id 作为主键?
  6. vscode:设置语言为中文
  7. SQL:postgresql中拼接字符串
  8. 分布式存储系统Minio简介
  9. 记录下我的Linux系统中vim文件的配置---(.vimrc文件配置模板)
  10. Java爬虫工程师技能列表