在https://blog.csdn.net/zhanghanx/article/details/80807759一文中,介绍了如何读取envi标准数据格式的影像图,接下来介绍如何使用这些数据进行彩色合成显示以及灰度图像的显示。
一、彩色合成
1、首先数据转换,在前面的文章中,像素值的存储方式是BSQ,但是想要通过bitmap显示的话,像素值的排列必须是BIP,并且三种颜色的顺序是BGR(千万不要弄错了,否则合成的图像是不对的)。
2、根据生成图像的行数和列数,声明一个新的Bitmap, 其中PixelFormat.Format24bppRgb设置了像素的类型为每个颜色为8位量化。具体的可以查看官方文档的说明。
3、声明一个BitmapData类,锁定内存地址。
4、将数据存储到内存中,其中BItmap DATa.Scan0指向开始的地址。
5、解锁内存区域
6、返回Bitmap即可。
代码如下:
private static Bitmap ToColorBitmap2(byte[] rawValues, int width, int height)
{
try
{
Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); 获取图像参数
int stride = bmpData.Stride; // 扫描线的宽度
IntPtr iptr = bmpData.Scan0; // 获取bmpData的内存起始位置
//int scanBytes = stride * height;// 用stride宽度,表示这是内存区域的大小
///用Marshal的Copy方法,将刚才得到的内存字节数组复制到BitmapData中
System.Runtime.InteropServices.Marshal.Copy(rawValues, 0, iptr, rawValues.Length);
bmp.UnlockBits(bmpData); // 解锁内存区域
算法到此结束,返回结果
return bmp;
}
catch (System.Exception e)
{
//Tools.m_CreateLogTxt("ToColorBitmap2", e.ToString(), Index);
return null;
}
}
其实看到网上有很多教程是是同memoryStream的方式的,但是总是出现参数无效的报错。找了很久,找到了如上的方法(具体的链接找不到了,如果有看到的朋友,可以在评论里告诉我,我将更新在文章中)
二、灰度合成
只要时的R=G=B,使用上述的方法就可以得到灰度图像了。