首页 > 范文大全 > 正文

MICAPS系统中云图数据转换为位图的实现

开篇:润墨网以专业的文秘视角,为您筛选了一篇MICAPS系统中云图数据转换为位图的实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:通过对气象信息综合分析处理系统(micaps)中第十三类数据格式和Windows系统的BMP位图格式的结构进行分析研究,将只能在MICAPS中显示的卫星云图转换为位图图像,从而扩展了卫星运图的查看方式,方便了工作。

关键词:MICAPS;位图;数据格式;转换

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)06-11603-01

1 引言

MICAPS系统中的云图以其简单、直观的方式显示了红外、水汽等云物理信息。但是在脱离了Micaps环境后,如何在Windows环境中再现云图呢?只需要在了解了Micaps第十三类数据格式和BMP位图的数据格式后,我们就可以编制一个转换程序用来在Windows操作系统环境下直接查看云图了。

2 数据格式说明

2.1 Micaps第十三类数据格式[1]

此格式规定了云图在Micaps中的文件存储格式。其前128字节为文本格式,记录了云图的时间、类型、长宽等信息。后512*512字节为二进制数据格式,以256级灰度表示云图的颜色。例如:

diamond 13 2005年9月7日22时0分FY2C红外图像200597 22512512 86.59 -0.64 11.0 1 ir.dat 110.00 30.00下面是256级灰度表示值。

2.2 BMP位图格式[2]

位图文件格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以前的BMP位图文件格式与显示设备有关,因此把它称为设备相关位图(device-dependent bitmap,DDB)文件格式。Windows 3.0以后的BMP位图文件格式与显示设备无关,因此把这种BMP位图文件格式称为设备无关位图(device-independent bitmap,DIB)格式,目的是为了让Windows能够在任何类型的显示设备上显示BMP位图文件。BMP位图文件默认的文件扩展名是BMP或者bmp。

位图文件由文件头、信息头、彩色表和定义位图的字节阵列四部分组成。位图文件头长度固定为14字节,包含文件类型、文件大小、存放位置等信息;位图信息头长度也是固定的40字节,包含图像的宽和高、图像的颜色位数、实际的位图数据占用的字节数、图像分辨率、本图像实际用到的颜色数等信息;彩色表也既是调色板,有些位图需要调色板,而有些位图,如真彩色图,不需要调色板;最后就是实际的图像数据。对于用到调色板的位图,图像数据就是该象素颜色在调色板中对应的索引值,对于真彩色图,图像数据就是实际像素的R、G、B值。

3 转换中的细节处理

3.1 BMP文件头区的处理

BMP位图文件头与信息头可以按其格式要求直接在程序中生成,各占14字节和40字节。在Micaps系统中,云图显示时的颜色表示来之于云图调色板,为256色。因此,在转换为BMP格式时,需要建立256色的位图彩色表。此时,就需要将Micaps中的云图调色板信息提出,生成BMP中的彩色表信息,为显示BMP格式云图做好准备。

3.2 数据区的处理

在Micaps第十三类数据格式中前128字节为文件头,数据格式为文本格式。转换时弃之不用。后面紧跟着以二进制存储的用256级灰度值表示的色彩索引值。在BMP中,图像的每一扫描行由表示图像像素的连续的字节组成,每一行的字节数取决于图像的颜色数目和用像素表示的图像宽度。扫描行是由底向上存储的,这就是说,阵列中的第一个字节表示位图左下角的像素,而最后一个字节表示位图右上角的像素。在我们的Micaps系统中,第十三类数据格式的数据存储也正是以这种方式存储的。因此,在将第十三类数据格式转换为BMP格式时,数据的迁移不需要做过多的处理,只需采用流数据读取文件方式原样读取后转存就可以了。

4 程序实现

了解了上述信息后,就可通过程序来实现转换了。这里用Delphi来实现这一过程。文中只列出程序的主要语句部分。

4.1 生成BMP文件头

with BitmapFileHeader do// 设置位图文件头信息

begin

bfType:= $4D42; // 'BM' 标志, BITMAP 文件头

bfReserved1 := 0; //保留

bfReserved2 := 0; //保留

bfOffBits := SizeOf(BitmapFileHeader) + SizeOf(BitmapInfoHeader) + 1024;

//位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位

bfSize := bitmapinfoHeader.biWidth*bitmapinfoHeader.biHeight+1024+SizeOf(BitmapFileHeader)+SizeOf(BitmapInfoHeader);

//位图文件大小

end;

4.2 生成BMP信息头

with BitmapInfoHeader do//位图信息头

begin

biSize := SizeOf(TBitmapInfoHeader);//本结构所占用字节数

biWidth := 512; //位图宽度

biHeight:= 512; //位图高度

biPlanes:= 1; //目标设备级别,必须1

biBitCount:= 8; //每个像素所需位数,256色为8

biCompression := BI_RGB;//是否压缩,不压缩是0

biSizeImage := 0; //位图的大小,以字节为单位

biXPelsPerMeter := 0; //位图水平分辨率,每米像素数

biYPelsPermeter := 0; //位图垂直分辨率,每米像素数

biClrUsed := 0;//位图实际使用的颜色表中的颜色数

biClrImportant:= 0; //位图显示过程中重要的颜色数

end;

4.3 生成彩色表

在基于调色板的256色模式下,当一幅图像显示时,Windows把图像的逻辑调色板载入,并通过调色板映射把逻辑调色板映射到系统调色板,图像的每一像素的显示颜色都映射自系统调色板的一个颜色索引值,每个索引对应一个24位的RGB全彩色值。当系统调色板改变时,当前引用系统调色板的窗口的像素颜色也随之改变,而这种改变是系统在硬件刷屏中自动完成的,速度极快,这样就为我们利用调色板实现云图图像的显示提供了引擎。

建立一基于系统调色板的数组tpal = array[0..255] of tpaletteentry,再新建一tpal数组的对象pal。然后采用二进制读文件方法将Micaps系统中的调色板文件Colormap.004中的R、G、B值读入到此对象中,就可形成彩色表。

4.4 最终云图部分的实现

整体BMP云图的实现按以下思路进行。BMP图形是以二进制数据保存的,因此需采用流式数据写文件,首先申请建立一MemoryStream,然后将前面准备好的各种信息头依次输出到此MemoryStream中,然后将此二进制流输出到磁盘文件中。

MemoryStream := TmemoryStream.Create;

MemoryStream.Position := 0;

MemoryStream.Write(BitmapFileHeader, SizeOf(TBitmapFileHeader)); // 写入位图文件头

MemoryStream.Write(BitmapinfoHeader, SizeOf(TBitmapinfoHeader)); // 写入信息头内容

MemoryStream.Write(pal,sizeof(pal)); //写入调色盘内容

BlockRead(From, Buf, SizeOf(Buf), NumRead); //读取Micaps系统十三类格式文件的数据部分。其中,From为所读十三类格式文件指针,Buf为一512×512字节的数组,用于存放十三类格式文件的数据部分

MemoryStream.Write(buf,sizeof(buf)); //写入数据内容

memorystream.SaveToFile('star.bmp'); //生成BMP图

4 结束语

本文通过分析BMP和Micaps系统中的相关数据格式,运用软件实现了云图格式的转换。便于今后云图的查看。同时,也可采用这种思路,完成其它相关图像类数据的转换。在本程序中,程序实现的关键在于使用了MemoryStream来完成BMP中各部分数据的合成,这钟方法在其它二进制文件的数据处理中也是适用的。

参考文献:

[1]中国气象局重点工程办公室9210工程项目组[M].MICAPS系统管理员手册.

[2]Willian K.Pratt.数字图像处理[M].机械工业出版社,2005,1,第1版.

本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。