バイナリデータストリームから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);
		}
	}
}