///

/// GDAL栅格转换为位图

///

/// GDAL Dataset

/// 显示区域

/// 需要显示的波段列表

/// 返回Bitmap对象

public Bitmap GetImage(OSGeo.GDAL.Dataset ds, Rectangle showRect, int[] bandlist)

{

int imgWidth = ds.RasterXSize;   //影像宽

int imgHeight = ds.RasterYSize;  //影像高

float ImgRatio = imgWidth / (float)imgHeight;  //影像宽高比

//获取显示控件大小

int BoxWidth = showRect.Width;

int BoxHeight = showRect.Height;

float BoxRatio = imgWidth / (float)imgHeight;  //显示控件宽高比

//计算实际显示区域大小,防止影像畸变显示

int BufferWidth, BufferHeight;

if (BoxRatio >= ImgRatio)

{

BufferHeight = BoxHeight;

BufferWidth = (int)(BoxHeight * ImgRatio);

}

else

{

BufferWidth = BoxWidth;

BufferHeight = (int)(BoxWidth/ImgRatio);

}

//构建位图

Bitmap bitmap = new Bitmap(BufferWidth, BufferHeight,

System.Drawing.Imaging.PixelFormat.Format24bppRgb);

if (bandlist.Length==3)     //RGB显示

{

int[] r = new int[BufferWidth * BufferHeight];

Band band1 = ds.GetRasterBand(bandlist[0]);

band1.ReadRaster(0, 0, imgWidth, imgHeight, r, BufferWidth ,BufferHeight, 0, 0);  //读取图像到内存

//为了显示好看,进行最大最小值拉伸显示

double[] maxandmin1 = { 0, 0 };

band1.ComputeRasterMinMax(maxandmin1,0);

int[] g = new int[BufferWidth * BufferHeight];

Band band2 = ds.GetRasterBand(bandlist[1]);

band2.ReadRaster(0, 0, imgWidth, imgHeight, g, BufferWidth, BufferHeight, 0, 0);

double[] maxandmin2 = { 0, 0 };

band2.ComputeRasterMinMax(maxandmin2, 0);

int[] b = new int[BufferWidth * BufferHeight];

Band band3 = ds.GetRasterBand(bandlist[2]);

band3.ReadRaster(0, 0, imgWidth, imgHeight, b, BufferWidth, BufferHeight, 0, 0);

double[] maxandmin3 = { 0, 0 };

band3.ComputeRasterMinMax(maxandmin3, 0);

int i, j;

for (i = 0; i < BufferWidth; i++)

{

for (j = 0; j < BufferHeight; j++)

{

int rVal=Convert.ToInt32(r[i + j * BufferWidth]);

rVal = (int)((rVal - maxandmin1[0]) / (maxandmin1[1] - maxandmin1[0]) * 255);

int gVal=Convert.ToInt32(g[i + j * BufferWidth]);

gVal = (int)((gVal - maxandmin2[0]) / (maxandmin2[1] - maxandmin2[0]) * 255);

int bVal=Convert.ToInt32(b[i + j * BufferWidth]);

bVal = (int)((bVal - maxandmin3[0]) / (maxandmin3[1] - maxandmin3[0]) * 255);

Color newColor = Color.FromArgb(rVal, gVal, bVal);

bitmap.SetPixel(i, j, newColor);

}

}

}

else               //灰度显示

{

int[] r = new int[BufferWidth * BufferHeight];

Band band1 = ds.GetRasterBand(bandlist[0]);

band1.ReadRaster(0, 0, imgWidth, imgHeight, r, BufferWidth, BufferHeight, 0, 0);

double[] maxandmin1 = { 0, 0 };

band1.ComputeRasterMinMax(maxandmin1, 0);

int i, j;

for (i = 0; i < BufferWidth; i++)

{

for (j = 0; j < BufferHeight; j++)

{

int rVal = Convert.ToInt32(r[i + j * BufferWidth]);

rVal = (int)((rVal - maxandmin1[0]) / (maxandmin1[1] - maxandmin1[0]) * 255);

Color newColor = Color.FromArgb(rVal, rVal, rVal);

bitmap.SetPixel(i, j, newColor);

}

}

}

return bitmap;

}

主函数调用

private void ImageShow()

{

string filename="";

OpenFileDialog dlg = new OpenFileDialog();

dlg.Filter = "Tiff文件|*.tif|Erdas img文件|*.img|Bmp文件|*.bmp|jpeg文件|*.jpg|所有文件|*.*";

if (dlg.ShowDialog() == DialogResult.OK)

{

filename = dlg.FileName;

}

if (filename == "")

{

MessageBox.Show("影像路径不能为空");

return;

}

OSGeo.GDAL.Dataset ds= Gdal.Open(filename, Access.GA_ReadOnly);

if(ds==null)

{

MessageBox.Show("影像打开失败");

return;

}

Rectangle pictureRect = new Rectangle();

pictureRect.X = 0;

pictureRect.Y = 0;

pictureRect.Width = this.pictureBox1.Width;

pictureRect.Height = this.pictureBox1.Height;

int[] disband = {3,2,1};

Bitmap bitmap = GetImage(ds, pictureRect, disband);   //遥感影像构建位图

pictureBox1.Image = bitmap;                   //将位图传递给PictureBox控件进行显示

}

c#写图像tif gdal_C# GDAL显示TIF相关推荐

  1. c#写图像tif gdal_Gdal系列 (二)读取图像基本操作b + 简单波段合成

    点击上方蓝字关注我们 " 基本操作第二辑+简单波段合成." 一.基本操作 通过gdal提供的GetDriverByName方法构建一个driver对象.其中file_format是 ...

  2. Kodak Imgedit.ocx控件显示tif图像

    用Kodak Imgedit.ocx控件显示tif图像,可实现翻页显示多页的tif,并根据控件尺寸自动调整图片大小,相关代码如下: Option Explicit Dim iPage As Integ ...

  3. python使用gdal读取tif经纬度

    python使用gdal读取tif经纬度 前言 一.tif是什么? 二.使用gdal读取经纬度 1.引入库 2.读取坐标 总结 前言 博主作为一个GIS开发者,开发过程中不免遇到一些处理tif的问题和 ...

  4. python中利用GDAL对tif文件进行读写

    利用GDAL库对tif影像进行读取 示例代码默认波段为[B.G.R.NIR的顺序,且为四个波段] import gdal def readTif(fileName):dataset = gdal.Op ...

  5. 【GDAL基础教程】多张二维tif数据转三维tif数据

    [GDAL基础教程]多张二维tif数据转三维tif数据 今天分享一下多张二维单波段tif数据合并为一张三维多波段tif数据的脚本,话不多说,详见代码. 原数据 # -*- encoding: utf- ...

  6. 《OpenCV 4开发详解》图像的读取与显示

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  7. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析

    [-] 一开胃菜之一  关于OpenCV的命名空间 二开胃菜之二  关于Mat类型 三图像的载入和显示 imread函数 namedWindow函数 imshow函数 四输出图像到文件imwrite函 ...

  8. OpenCV(二)图像的载入,显示,和输出

    一.OpenCV的命名空间 在写简单的OpenCV程序的时候,以下两句话是标配: #include<opencv2/opencv.hpp> using namespace cv; 二.关于 ...

  9. OpenCV 图像加载和显示

    OpenCV 图像加载和显示 OpenCV 图像加载和显示 加载图像(使用cv :: imread) 创建一个名为OpenCV的窗口(使用cv :: namedWindow) 在OpenCV窗口中显示 ...

最新文章

  1. oracle中显示周,oracle中得到一段时间内天,月,周列表
  2. 第39次《中国互联网络发展状况统计报告》发布
  3. OS_CORE.C(4)
  4. Mac 实现keras网络模型可视化【conda】
  5. 在Eclipse里搭建Go开发的环境
  6. 简明python教程怎么买-简明python教程在哪买!《简明python教程》 下载地址?
  7. Segment Routing MPLS介绍
  8. access如何查询两张表的内容_在Excel中使用SQL语句实现精确查询
  9. 2016 上海 Qcon 值得关注的技术
  10. 用phpexcel导入导出文件
  11. 1.firefox缺少flash插件
  12. 学习太极创客 — ESP8226 (二)
  13. labview压装设备最终代码,基于QMH框架和Machine框架有机结合
  14. vue.js环境+腾讯防水墙+实现弹窗滑动模块验证登录
  15. 性能测试监控TP50、TP99、TP999含义
  16. 买台式计算机什么指标的好,购买电脑时,只要你了解了这几个参数,就能保证不被坑...
  17. 矽力杰代理商的增长与模拟信号
  18. win2003服务器安全设置技术实例(二)
  19. 地铁涨价,新出台的javase计算每月乘坐地铁消费金额
  20. html嵌入bilibili视频

热门文章

  1. 从0到1:构建强大且易用的规则引擎
  2. 2020校招薪酬大比拼,你被倒挂了没?
  3. 你以为它挂了么?并没有!Apache Struts 2.5.22 GA 发布
  4. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解 | 必须收藏!
  5. 一文了解5G是什么,将如何影响我们的未来
  6. 三态门有一个信号控制端en_W25Q32JVSSIQ|哪些PCB设计会影响信号质量?
  7. 归一化EvoNorms
  8. E0144 const char * 类型的值不能用于初始化 char * 类型的实体
  9. 遥感图像处理-阴影检测
  10. 相机自动对焦 OpenCV 图像清晰度评价