从二进制数据流中构造GDAL可以读取的图像数据(C#)

在上一篇博客中,讲了一下使用GDAL从文件流中构造一个GDAL可以识别的数据来进行处理。原以为这个接口在C#中没有,仔细看了下GDAL库中源码,发现C#版本也有类似的函数,下面是GDAL库中的一个C#使用示例代码。

using System;
using System.IO;

using System.Runtime.InteropServices;
using OSGeo.GDAL;

/// <summary>
/// 一个基于C#语言的简单示例,使用内存文件
/// </summary> 

class VSIMem
{
	
	public static void usage() 
	{ 
		Console.WriteLine("使用例子: vsimem [image file]");
		System.Environment.Exit(-1);
	}
 
	public static void Main(string[] args)
	{
		if (args.Length != 1)	//如果输入的参数不等于1,返回
			usage();

		byte[] imageBuffer; //定义一个buffer用来存储命令行输入的信息
		//将输入的信息写入buffer中
		using (FileStream fs = new FileStream(args[0], FileMode.Open, FileAccess.Read))
		{
			using (BinaryReader br = new BinaryReader(fs))
			{
				long numBytes = new FileInfo(args[0]).Length;
				imageBuffer = br.ReadBytes((int)numBytes);
				br.Close();
				fs.Close();
			}
		}

		//注册GDAL驱动
		Gdal.AllRegister();

		//构造内存文件名称,必须以/vsimem/开头
		string memFilename = "/vsimem/inmemfile";
		try
		{
			//从二进制流中构造内存文件
			Gdal.FileFromMemBuffer(memFilename, imageBuffer);
			//使用GDAL打开数据进行处理
			Dataset ds = Gdal.Open(memFilename, Access.GA_ReadOnly);

			Console.WriteLine("Raster dataset parameters:");
			Console.WriteLine("  RasterCount: " + ds.RasterCount);
			Console.WriteLine("  RasterSize (" + ds.RasterXSize + "," + ds.RasterYSize + ")");

			//将内存文件转存为一个GeoTiff文件
			Driver drv = Gdal.GetDriverByName("GTiff");
			if (drv == null)
			{
				Console.WriteLine("Can't get driver.");
				System.Environment.Exit(-1);
			}

			drv.CreateCopy("sample.tif", ds, 0, null, null, null);
		}
		catch (Exception ex)
		{
			Console.WriteLine(ex.Message);
		}
		finally
		{
			Gdal.Unlink(memFilename);
		}
	}
}

转载于:https://www.cnblogs.com/xiaowangba/p/6313916.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值