gdal浅析(二)波段操作
上次分析到将栅格数据读取到Dataset中,每个Dataset中包含若干个波段,Now let's go on!
首先介绍Band类:
band类是用来描述栅格数据的各个波段的信息的。
详细的类介绍在此不贴出来了,太长,影响阅读效果。
其中主要的属性和方法将随着我下面的两个函数详细介绍。
本来这两天忙着看云计算,没有把心思放在Gdal上,恰巧Mr Zuo在研究workflow时建议我写一个可扩展可应用的处理栅格数据的模块让他在workflow中调用,于是便有了下面的文章。
今天主要写了两个函数
一、绝大部分栅格数据含有三个波段,其中的单一波段都不含颜色信息,只有灰度值信息,我们可以将这三个波段分别转换成基于RGB三原色的灰度图片
\\将某一波段转换成只有灰度值的Image
void
bandtoGrayImage(Band band, string fileName)
其中主要几个步骤
1、band.ReadRaster(0, 0, width, height, data, width, height,
0, 0);
将波段中的数据以byte的格式读到数组byte[] data中。
这意味着该波段的每一个像素的颜色灰度值按照先行后列的顺序存到数组中了。
2、Color newColor = Color.FromArgb(Convert.ToInt32(data[i +
j * width]), Convert.ToInt32(data[i + j * width]), Convert.ToInt32(data[i + j *
width]));
bitmap.SetPixel(i, j, newColor);
将灰度值作为RGB的值,并由此计算出color值,并按像素绘制到Image中。
这一步因为需要按像素逐点计算并着色,需要较长的时间。但是将数组存储的像素值转换成Image貌似也只有这个笨方法了。实验中我将一个960×480的栅格文件转换出三个波段的图片需要2分钟左右。
上述函数中的newColor是将RGB三原色的值都等于同一灰度值,如果只是将其中一个赋为灰度值,其他两个设为0,则得到基于RGB的彩色图片。
即:Color newColor = Color.FromArgb(Convert.ToInt32(data[i +
j * width]), 0, 0); //基于红色的彩色图像
这时候需要修改函数接口,增加一个标志项
void bandtoColorImage(Band band, string fileName,int
colorType)
二、还有一种栅格数据只含有一个波段,而且这个波段是由RGB三原色波段组合而成的,含有颜色信息。因此我们可以将这一个波段转换成基于RGB三原色的有颜色的图片。这中栅格数据我只有一幅,还是从网上的一个实例中找到的。
\\将某一波段转换成只有灰度值的Image
void
bandtoColorsImage(Band band, string fileName)
其中主要几个步骤
1、band.ReadRaster(0, 0, width, height, data, width, height,
0, 0);
原理同一
2、ColorTable ct = band.GetRasterColorTable();
读取该波段的颜色表,其中的ColorTable类就是用来描述颜色表的,在下一步有重要作用。
3、ColorEntry entry = ct.GetColorEntry(data[i + j * width]);
获取颜色值。ColorTable类中的GetColorEntry方法可以将数组中灰度值转换成颜色值。这里出现的ColorEntry类是一种颜色值的表述。
4、Color newColor =
Color.FromArgb(Convert.ToInt32(entry.c1), Convert.ToInt32(entry.c2),
Convert.ToInt32(entry.c3));
bitmap.SetPixel(i, j, newColor);
这一步从ColorEntry的实例中获取RGB格式的颜色值,entry.c1,entry.c2,entry.c3分别对应RGB三色值。