c#写图像tif gdal_C# GDAL显示TIF
///
/// 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相关推荐
- c#写图像tif gdal_Gdal系列 (二)读取图像基本操作b + 简单波段合成
点击上方蓝字关注我们 " 基本操作第二辑+简单波段合成." 一.基本操作 通过gdal提供的GetDriverByName方法构建一个driver对象.其中file_format是 ...
- Kodak Imgedit.ocx控件显示tif图像
用Kodak Imgedit.ocx控件显示tif图像,可实现翻页显示多页的tif,并根据控件尺寸自动调整图片大小,相关代码如下: Option Explicit Dim iPage As Integ ...
- python使用gdal读取tif经纬度
python使用gdal读取tif经纬度 前言 一.tif是什么? 二.使用gdal读取经纬度 1.引入库 2.读取坐标 总结 前言 博主作为一个GIS开发者,开发过程中不免遇到一些处理tif的问题和 ...
- python中利用GDAL对tif文件进行读写
利用GDAL库对tif影像进行读取 示例代码默认波段为[B.G.R.NIR的顺序,且为四个波段] import gdal def readTif(fileName):dataset = gdal.Op ...
- 【GDAL基础教程】多张二维tif数据转三维tif数据
[GDAL基础教程]多张二维tif数据转三维tif数据 今天分享一下多张二维单波段tif数据合并为一张三维多波段tif数据的脚本,话不多说,详见代码. 原数据 # -*- encoding: utf- ...
- 《OpenCV 4开发详解》图像的读取与显示
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析
[-] 一开胃菜之一 关于OpenCV的命名空间 二开胃菜之二 关于Mat类型 三图像的载入和显示 imread函数 namedWindow函数 imshow函数 四输出图像到文件imwrite函 ...
- OpenCV(二)图像的载入,显示,和输出
一.OpenCV的命名空间 在写简单的OpenCV程序的时候,以下两句话是标配: #include<opencv2/opencv.hpp> using namespace cv; 二.关于 ...
- OpenCV 图像加载和显示
OpenCV 图像加载和显示 OpenCV 图像加载和显示 加载图像(使用cv :: imread) 创建一个名为OpenCV的窗口(使用cv :: namedWindow) 在OpenCV窗口中显示 ...
最新文章
- oracle中显示周,oracle中得到一段时间内天,月,周列表
- 第39次《中国互联网络发展状况统计报告》发布
- OS_CORE.C(4)
- Mac 实现keras网络模型可视化【conda】
- 在Eclipse里搭建Go开发的环境
- 简明python教程怎么买-简明python教程在哪买!《简明python教程》 下载地址?
- Segment Routing MPLS介绍
- access如何查询两张表的内容_在Excel中使用SQL语句实现精确查询
- 2016 上海 Qcon 值得关注的技术
- 用phpexcel导入导出文件
- 1.firefox缺少flash插件
- 学习太极创客 — ESP8226 (二)
- labview压装设备最终代码,基于QMH框架和Machine框架有机结合
- vue.js环境+腾讯防水墙+实现弹窗滑动模块验证登录
- 性能测试监控TP50、TP99、TP999含义
- 买台式计算机什么指标的好,购买电脑时,只要你了解了这几个参数,就能保证不被坑...
- 矽力杰代理商的增长与模拟信号
- win2003服务器安全设置技术实例(二)
- 地铁涨价,新出台的javase计算每月乘坐地铁消费金额
- html嵌入bilibili视频
热门文章
- 从0到1:构建强大且易用的规则引擎
- 2020校招薪酬大比拼,你被倒挂了没?
- 你以为它挂了么?并没有!Apache Struts 2.5.22 GA 发布
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解 | 必须收藏!
- 一文了解5G是什么,将如何影响我们的未来
- 三态门有一个信号控制端en_W25Q32JVSSIQ|哪些PCB设计会影响信号质量?
- 归一化EvoNorms
- E0144	const char * 类型的值不能用于初始化 char * 类型的实体
- 遥感图像处理-阴影检测
- 相机自动对焦 OpenCV 图像清晰度评价