C#结合GDAL实现图像加运算

        private void btnMapPlus_Click(object sender, EventArgs e)
        {
            string mapAdd01 = @"E:\\add01-330-210.jpg";
            string mapAdd02 = @"E:\\add02-330-210.jpg";

            Gdal.AllRegister();
            //更改读写权限
            Dataset srcDs1 = Gdal.Open(mapAdd01, Access.GA_ReadOnly);
            Dataset srcDs2 = Gdal.Open(mapAdd02, Access.GA_ReadOnly);

            DataType srcType = srcDs1.GetRasterBand(1).DataType;
            //MessageBox.Show(srcType.ToString());

            int bandCount = srcDs1.RasterCount;
            int srcWidth = srcDs1.RasterXSize;
            int srcHeight = srcDs1.RasterYSize;

            int[] bandArray = new int[bandCount];
            for (int i = 0; i < bandCount; i++)
            {
                bandArray[i] = i + 1;
            }

            //注意,JPG没有实现Create方法来创建
            //Dataset dstDs= drv.Create(dstFileName,srcWidth,srcHeight,bandCount,DataType.GDT_Byte,null);

            //首先创建一个内存的驱动
            string strMemory = @"E:\AddMemory.jpg";
            Driver dryMemory = Gdal.GetDriverByName("MEM");
            Dataset dsMemory = dryMemory.Create(strMemory, srcWidth, srcHeight, bandCount, DataType.GDT_Byte, null);

            int[] dataArray1 = new int[srcWidth * srcHeight * bandCount];
            int[] dataArray2 = new int[srcWidth * srcHeight * bandCount];
            int[] newArray = new int[srcWidth * srcHeight * bandCount];
            srcDs1.ReadRaster(0, 0, srcWidth, srcHeight, dataArray1, srcWidth, srcHeight, bandCount, bandArray, 0, 0, 0);
            srcDs2.ReadRaster(0, 0, srcWidth, srcHeight, dataArray2, srcWidth, srcHeight, bandCount, bandArray, 0, 0, 0);


            if (srcType == DataType.GDT_Byte)
            {
                /***********图像代数相加实现**************/
                for (int iband = 0; iband < 3; iband++)
                {
                    int temp = iband * srcHeight * srcWidth;
                    
                    for (int i = 0; i < srcHeight; i++)
                    {
                        for (int j = 0; j < srcWidth; j++)
                        {
                            newArray[temp + i * srcWidth + j] = dataArray1[temp + i * srcWidth + j] + dataArray2[temp + i * srcWidth + j];
                        }
                    }
                }
                

                //将更新数值的数据重新写入图像
                dsMemory.WriteRaster(0, 0, srcWidth, srcHeight, newArray, srcWidth, srcHeight, bandCount, bandArray, 0, 0, 0);
                dsMemory.FlushCache();
            }

            Driver drvJPG = Gdal.GetDriverByName("JPEG");
            string dstFileName = @"E:\Result_Add.jpg";

            drvJPG.CreateCopy(dstFileName, dsMemory, 1, null, null, null);

            //最后释放资源
            dsMemory.Dispose();
            srcDs1.Dispose();
            srcDs2.Dispose();
            MessageBox.Show("图像相加:success");

        }

原图1:


原图2:


加效果:


课件效果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值