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格式阅读原文。
原文地址http://qkzz.net/magazine/1009-3044/2007/09/837069.htm
原文地址:https://www.cnblogs.com/bnuvincent/p/1528767.html