using OSGeo.GDAL;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Clip01
{
class Program
{
static void Main(string[] args)
{
//规则裁剪
string srcFileName = @"E:\GF1_PMS1_E116.3_N40.3_20130501_L1A0000152737\GF1_PMS1_E116.3_N40.3_20130501_L1A0000152737\GF1_PMS1_E116.3_N40.3_20130501_L1A0000152737-PAN1.tiff";
string dstFileName = @"E:\GDAL\GDALPractice\GDAL_in_CSharp\chapter07\Clip01result.tif";
if (File.Exists(dstFileName))
File.Delete(dstFileName);
Gdal.AllRegister();
Dataset srcDs= Gdal.Open(srcFileName, Access.GA_ReadOnly);
DataType srcType = srcDs.GetRasterBand(1).DataType;
int bandCount = srcDs.RasterCount;
Console.WriteLine("原始影像数据类型是:{0}", srcType);
Console.WriteLine("原始影像的列数:{0}", srcDs.RasterXSize);
Console.WriteLine("原始影像的行数:{0}", srcDs.RasterYSize);
Console.WriteLine("请输入裁剪从第几列开始:");
int startXSize = Convert.ToInt32( Console.ReadLine());
Console.WriteLine("请输入裁剪从第几行开始:");
int startYSize = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入裁剪图像的宽度:");
int dstXSize = Convert.ToInt32( Console.ReadLine());
Console.WriteLine("请输入裁剪图像的高度:");
int dstYSize = Convert.ToInt32(Console.ReadLine());
double[] adfGeoTransform = new double[6];
srcDs.GetGeoTransform(adfGeoTransform);
//如果图像不含地理坐标信息,默认返回值是:(0,1,0,0,0,1)
//左上角点坐标(padfGeoTransform[0],padfGeoTransform[3]);
//padfGeoTransform[1]是像元宽度(影像在宽度上的分辨率);
//p/adfGeoTransform[5]是像元高度(影像在高度上的分辨率);
//如果影像是指北的,padfGeoTransform[2]和padfGeoTransform[4]这两个参数的值为0。
Driver drv = Gdal.GetDriverByName("GTIFF");
Dataset dstDs= drv.Create(dstFileName, dstXSize, dstYSize, bandCount, srcType, null);
dstDs.SetGeoTransform(adfGeoTransform);
dstDs.SetProjection(srcDs.GetProjectionRef());
int[] bandArray=new int[bandCount];
for (int i = 0; i < bandCount; i++)
{
bandArray[i] = i + 1;
}
if (srcType == DataType.GDT_UInt16)
{
int[] dataArray = new int[dstXSize * dstYSize*bandCount ];
srcDs.ReadRaster(startXSize, startYSize, dstXSize, dstYSize, dataArray, dstXSize, dstYSize,bandCount,bandArray, 0, 0, 0);
dstDs.WriteRaster(0, 0, dstXSize, dstYSize, dataArray, dstXSize, dstYSize, bandCount, bandArray, 0, 0, 0);
dstDs.FlushCache();
}
Console.WriteLine("success");
Console.WriteLine();
Console.WriteLine("裁剪影像的宽为:{0},高为:{1}。", dstDs.RasterXSize,dstDs.RasterYSize);
//最后释放资源
srcDs.Dispose();
dstDs.Dispose();
Console.ReadKey();
}
}
}
原始图像:
裁剪效果:
注意:
1. 期间,发生了““OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常。”的错误,后面发现是在64位系统下,有时候使用x64有时候使用X86平台的缘故,这样在debug下面会有两个文件夹:
这样应该仔细检查是不是在x64或x86平台下相应的文件夹里面是否有那9个相应的dll文件。
2.注意srcDs.ReadRaster方法有六个重载方法,对应不同的数据类型的数组(用来存储读取图像的灰度值)。