天天看点

从二进制数据流中构造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);
		}
	}
}      

继续阅读