今天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++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- Qt实战|Qt+OpenCV联合开发(二十一)--图像翻转与旋转
- Qt实战|Qt+OpenCV联合开发(十四)--图像感兴趣区域(ROI)的提取
- Qt实战|Qt+OpenCV联合开发(十三)--通道分离与合并
- opencv|Qt+OpenCV联合开发(十六)--图像几何形状绘制
- Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
- SNAT的MASQUERADE地址选择与端口选择
- IPTABLES的连接跟踪与NAT分析
- IPVS分析