C#结合GDAL实现规则影像裁剪

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方法有六个重载方法,对应不同的数据类型的数组(用来存储读取图像的灰度值)


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值