using OSGeo.GDAL;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ChangeSrcMap
{
class Program
{
static void Main(string[] args)
{
string srcFileName = @"E:\copy_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";
Gdal.AllRegister();
//Dataset srcDs = Gdal.Open(srcFileName, Access.GA_ReadOnly);
//更改权限
Dataset srcDs = Gdal.Open(srcFileName, Access.GA_Update);
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());
int[] bandArray = new int[bandCount];
for (int i = 0; i < bandCount; i++)
{
bandArray[i] = i + 1;
}
Random r = new Random();
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);
//大于150的随机减去150之内的数,小于150的随机加上149之内的数
for (int i = 0; i < dataArray.Length; i++)
{
if(dataArray[i]>=150)
{
dataArray[i] -= r.Next(150);
}
else if(dataArray[i]>0) //(0,149)
{
dataArray[i] += r.Next(149);
}
}
//将更新数值的数据重新写入图像
srcDs.WriteRaster(startXSize, startYSize, dstXSize, dstYSize, dataArray, dstXSize, dstYSize, bandCount, bandArray, 0, 0, 0);
srcDs.FlushCache();
}
Console.WriteLine("图像更新success");
Console.WriteLine();
//最后释放资源
srcDs.Dispose();
Console.ReadKey();
}
}
}
输入:
原始影像:
更新效果: