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