C#利用GDAL打开图像并拉伸像素值生成jpg快视图

今天31号了,又是周五,10月份要结束了。最近一周的心态很不好,很低落,包括多方面的原因:开题未定,项目紧迫。如果说外界的因素能让我萎靡不振,那么肯定是我的内心不够强大,性格不够乐观。期间我也找到了一些自己的毛病:懒!

直接上代码吧(因为源图像为288*180,所以未做重采样):

  private void buttonX1_Click(object sender, EventArgs e)
  {
       Gdal.AllRegister();  
       Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");  
       string filePathName = "";  
       OpenFileDialog dlg = new OpenFileDialog();  
       if (dlg.ShowDialog() == DialogResult.OK)  
        {  
          //filePathName保存了路径加文件名  
          filePathName = dlg.FileName;  
        }  
  
       if (filePathName == "")  
        {  
           MessageBox.Show("影像路径不能为空");  
           return;  
        }  
  
       Dataset ds = Gdal.Open(filePathName, Access.GA_ReadOnly);
  
       Band band = ds.GetRasterBand(1);
         
       double[] maxminValue=new double[2];
       读取该波段的最大最小值,并保存在一个double型数组maxminValue中
       band.ComputeRasterMinMax(maxminValue,1);
 
       创建C#的Bitmap类,288为宽度(像素为单位),180为高度(像素为单位)
       Bitmap quickBitmap = new Bitmap(288, 180,System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                     
       //新建快视图大小的RGB三原色数组
       int[,] RR = new int[180, 288];
       int[,] GG = new int[180, 288];
       int[,] BB = new int[180, 288];
                     
       //double型数组pixelValue用来存储GDAL打开的遥感影像(大小为288(宽)*180(高))的所有像素的灰度值
       double[] pixelValue = new double[288 * 180];
           
       //调用band.ReadRaster()函数将遥感影像的所有像素值存储在double型数组pixelValue中。
					
       //band.ReadRaster()的一种重载方法是:
       //public CPLErr ReadRaster(int xOff, int yOff, int xSize, int ySize, byte[] buffer, 
               //   int buf_xSize, int buf_ySize, int pixelSpace, int lineSpace)
       //这里面,xOff和yOff是指偏移量,即从影像的左上角起始坐标(xOff,yOff)开始读取数据。
       //xSize和ySize是指读取图像数据的行列数,即宽度和高度,单位都是像素。Buffer是图像数据缓存。
       //buf_xSize和buf_ySize是缓存区的大小,它们须与buffer申请的大小保持一致,通过这两个参数可以控制缩放,
       //如果它们小于xSize和ySize就是将原图缩小,反之如果它们大于xSize和ySize就是将原图放大。
       //pixelSpace和lineSpace一般默认取0即可。 

        band.ReadRaster(0, 0, 288, 180, pixelValue, 288, 180, 0, 0);
        //band.ReadRaster()函数各个参数含义:0,0是相对于遥感图像左上角开始读取的像素值的位置的偏移量
	//288,180是从起始位置开始的要读取像素值的矩形区域(应该小于整个遥感影像的大小)
	//double型数组pixelValue用来存储所选影像范围的所有像素值
	//288,180是是缓存区的大小
	//最后两个参数默4认取0

        //下面只是一种将灰度图像变换为彩色图像的一种方法。
        int level = 0; 
        for (int i = 0,index=0; i < 180; i++)
          for (int j = 0; j < 288; j++)
             {
	        //如果原图像无灰度值或者灰度值为0,则RGB都置为0
	        if (pixelValue[index++] == 0)
		 {
	            RR[i, j] = 0;
		    GG[i, j] = 0;
		    BB[i, j] = 0;
		 }
		 //如果原图像有灰度值,即灰度值不为0,则进行伪彩色变换(这是一种方法)
                 level = (int)((pixelValue[index] * 510 )/ (maxminValue[1] - maxminValue[0]));
                 if(level<=255)
                  {
                     RR[i,j]=0;
                     GG[i, j] =level ;
                     BB[i,j]=255-level;
                  }
                 else if (level > 255 && level < 510)
                       {
                           RR[i, j] = level - 255;
                           GG[i, j] = 255 - (level - 255);
                           BB[i, j] = 0;
                       }
                        
		 //通过指定位置i,j以及RGB值构造bitmap图像。
		 //注意此处前两个参数:j在前,i在后
                 quickBitmap.SetPixel(j,i, Color.FromArgb(RR[i, j], GG[i, j], BB[i, j]));
             }
                   
        //将新建生成的bitmap图像另存为jpg格式的图像
        quickBitmap.Save("E:\\TEMP\\testQuickView.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
        
        System.Windows.Forms.MessageBox.Show("另存成功!"); 

  }

效果:

源图像:

C#利用GDAL打开图像并拉伸像素值生成jpg快视图_第1张图片

快视图:

C#利用GDAL打开图像并拉伸像素值生成jpg快视图_第2张图片




你可能感兴趣的:(C/C++/C#与RS,GIS技术)