C/C++/C#与RS|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=https://www.it610.com/article/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/C++/C#与RS|C#利用GDAL打开图像并拉伸像素值生成jpg快视图
文章图片


快视图:
C/C++/C#与RS|C#利用GDAL打开图像并拉伸像素值生成jpg快视图
文章图片



【C/C++/C#与RS|C#利用GDAL打开图像并拉伸像素值生成jpg快视图】
??

    推荐阅读