GIS笔记_普通tif文件转成array数组 c#

2023-12-13 22:38

本文主要是介绍GIS笔记_普通tif文件转成array数组 c#,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引用的库文件:

using System;
using System.Collections;using System.Windows.Media.Imaging;
using System.Drawing;
using System.Drawing.Imaging;

主要功能函数 :

public static System.Array TifToArray(string tifPath)
{//tif -> bitmapImage tifImage = Image.FromFile(tifPath);Bitmap bitmap = new Bitmap(tifImage);int height = (int)bitmap.Height;int width = (int)bitmap.Width;System.Array pixelsArray = Array.CreateInstance(typeof(float), height, width);GrayBitmapData grayBitmapdata = new GrayBitmapData(bitmap);byte[,] bitData = null;bitData = grayBitmapdata.GetData();for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){int[] indices = { i, j };pixelsArray.SetValue(bitData[i, j], indices);}}return pixelsArray;
}

辅助类:

(此处假设输入的tif文件是32位的图像,format32bppArgbFlag)

class GrayBitmapData
{private byte[,] Data;private int Width;private int Height;public GrayBitmapData(){this.Width = 0;this.Height = 0;this.Data = null;}public  GrayBitmapData(Bitmap bmp){//from Bitmap to BitmapDataBitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);this.Width = bmpData.Width;this.Height = bmpData.Height;Data = new byte[Height, Width];int temp = 0;unsafe{byte* ptr = (byte*)bmpData.Scan0.ToPointer();for (int i = 0; i < Height; i++){for (int j = 0; j < Width; j++){temp = (int)(0.114 * (*ptr++)) + (int)(0.587 * (*ptr++)) + (int)(0.299 * (*ptr++));//skip the blank or unused space bits ptr++;Data[i, j] = (byte)temp;}//skip the blank space bit//if (format24bppRgbFlag)     ptr += bmpData.Stride - Width * 3;//if (format32bppArgbFlag)    ptr += 0;     // += bmpData.Stride - Width * 4; // https://www.cnblogs.com/dearzhoubi/p/8553763.html}}bmp.UnlockBits(bmpData);}public byte [,] GetData(){return Data;}
}

其他可能有用函数:(Bitmap <= 相互转换=> BitmapSource)

public static System.Drawing.Bitmap ToBitmap(BitmapSource source)
{using (System.IO.MemoryStream ms = new System.IO.MemoryStream()){BitmapEncoder encoder = new BmpBitmapEncoder();encoder.Frames.Add(BitmapFrame.Create(source));encoder.Save(ms);return new System.Drawing.Bitmap(ms);}
}public static BitmapSource ToBitmapSource(System.Drawing.Bitmap bmp)
{System.IntPtr hBitmap = bmp.GetHbitmap();try{return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, System.IntPtr.Zero, System.Windows.Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());}finally{DeleteObject(hBitmap);}
}[System.Runtime.InteropServices.DllImport("Gdi32.dll")]
private static extern bool DeleteObject(System.IntPtr hObject);

 

这篇关于GIS笔记_普通tif文件转成array数组 c#的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/490205

相关文章

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

C# Where 泛型约束的实现

《C#Where泛型约束的实现》本文主要介绍了C#Where泛型约束的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用的对象约束分类where T : structwhere T : classwhere T : ne

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的