摘要该文通过对Windows系统BMP位图数据结构和气象信息综合分析处理系统(MICAPS)中第十三类数据格式、第十五类数据格式进行分析,采用VB6.0编程技术,实现了MICPAS中显示的风云二号卫星云图转换为BMP位图。

前言随着风云二号卫星云图越来越广的使用,网站设计、媒体播报、预报制作等等都已开始使用风云二号卫星云图。MICPAS系统中,虽然以很简单、直观的方式显示了红外、水汽等云物理信息,但是脱离了MICPAS系统后,如何在Windows环境中再现云图呢?使之广泛的使用,已成为预报员不得不面对的一个重要问题。就当前的研究趋势来看,绝大多数关于图像处理的研究,多基于VC++和Delphi,而广大预报员使用最多的VB6.0编程技术,相应的研究很少,本文虽主要介绍MICAPS的云图转换,但触类旁通,对于定制BMP位图,也有一定的指示。

一、        BMP位图的DIB的结构
在 Windows 3.0 以前,Windows系统用的是DDB(Device Dependent Bitmap设备有关位图),DDB没有调色板,显示的颜色依赖硬件,处理色彩很不方便。从Windows 3.0以后重新定义了BMP文件格式,使其支持设备无关位图,以保证用某个应用程序创建的位图图形可以被其它应用程序装载或显示一样,也就是DIB(Device Independent Bitmap)。其结构主要由以下几个部分构成:(1)BITMAPFILEHEADER:BMP文件头;(2)DIB BITMAPINFOHEADER:BMP位图文件信息头;(3)RGBQUAD[]:BMP位图的调色板;(4)位图数据块。

二、        BMP位图的数据结构
BMP文件,为了节省存储空间,同时为了调用快捷,采用的是二进制存储方式,因此使用文本文件打开BMP格式,只能看到乱码。采用UltraEdit(UE)打开文件,就能对BMP的数据结构进行分析。

                        图1  使用UE打开任意位图的开始5行数据如图1所示,画红线部分为位图文件头,画绿线部分为位图文件信息头,画黄线部分为位图调色板。
位图文件头共分为4个部分,第一个部分“42 4D”表示“BM”两字,占用2个字节,为BYTE型。所有的位图都必须是以此开头;第二个部分“00 07 57 36”表示该位图文件的大小,为LONG型,占用4个字节。需注意的是该大小指的是实际大小,而不是文件占用空间的大小,从文件的属性里,可以查看到文件大实际大小,必须和这里是一致;第三个部分为两个保留字,均为INT型,共占用4个字节。目前为止,保留字必须为0;第四个部分,“00 00 04 36”为位图数据距离文件头的偏移字节数,为LONG型,占用4个字节,对于256色的位图来说,这个部分都为1078(10进制)。总计上述的部分,位图文件头总共占用字节数为14个。
位图文件信息头分为11个部分,第一个部分“00 00 00 28”为位图文件信息头的大小,为LONG型,占用4个字节;第二个部分“00 00 03 20”为位图的高度,单位为像素,数据为LONG型,占用4个字节;第三个部分为“00 00 02 58”为位图的宽度,单位是像素,数据为LONG型,占用4个字节;第四个部分“00 01”为设备的位平面数,现在都是1。数据为INT型,占用2个字节;第五个部分“00 08”为图像的颜色位数,数据为INT型,占用2个字节。1表示单色位图、4表示16色位图、8表示256色位图、24表示真彩色位图、32表示32位位图,默认情况下Windows不会处理最高8位的数据,多余位数将它作为Alpha通道;第六个部分“00 00 00 00”为图像的压缩方式,为LONG型,占用4个字节。BI_RGB表示无压缩,BI_RLE8表示行程编码压缩,目前为止,对于位图的压缩很少使用,因此采用默认的0;第七个部分“00 07 53 00”为实际的位图数据所占字节数,为LONG型,占用4个字节。需要注意的是,该大小不包括位图文件头的大小和位图文件信息头的大小,就为实际的位图数据块的大小,运算方式很简单,如果一个位图的分辨率为800 *600,那么这部分的大小就为480000;第八个部分“00 00 2E 23”和第九个部分“00 00 2E 23”分别表示位图的水平分辨率和垂直分辨率,即每米的像素,均为LONG型,占用4个字节。对于定制位图,因为不知道分辨率,可以将这两项设置为默认的0;第十个部分“00 00 00 00”表示位图实际使用的颜色表中的颜色数,为LONG型,占用4个字节。该项只有当位图的颜色为1、4、8的时候才有效,如果该项为0,表示颜色数为2^位图颜色,也就是说当位图颜色为8的时候,位图实际使用的颜色表中的颜色数就为2^8=256色;第十一个部分“00 00 00 00”表示重要的颜色数,为LONG型,占用4个字节。如果该项为0,表示所有的颜色都是重要的。总计上述的部分,位图文件信息头总共占用字节数为40个。
位图调色板数据,实际上是一个数组,该数组的大小是由位图的颜色位数和位图实际使用的颜色表中的颜色数所决定的。对于位图文件,只有当位图颜色位数为1、4、8的时候才有调色板,因此它们对应的调色板数组的元素个数分别是2、16、256。
在图1里,由于篇幅的限制,没有列出位图数据块的数据结构。对于位图文件来说,一行的图像数据叫做一个扫描行,一个扫描行的长度必须是4的倍数(字节),如果不是,则需要补齐。通常情况下DIB的扫描行是逆序存储的(相对于屏幕坐标系而言),即屏幕上的第一行是DIB位图数据的最后一行。对于常用的256色位图来说,它用8个字节表示一个像素的颜色索引,当位图显示时,根据当前索引值返回到位图的调色板中确定该像素的颜色;而对于真彩色图象来说,由于位图文件中没有调色板信息,就直接用24个字节表示一个像素的颜色,每个字节表示一种基色,也就是R、G、B分量中的一个值,需要注意的是,真彩色位图文件中三个字节的排列顺序是BGR,而不是传统的RGB。对于32位真彩色,是用32个字节表示一个像素颜色,类似于24位真彩,只是在每个BGR后加入了Alpha通道,用于透明度的调节。

三、        MICAPS数据格式分析

1、            MICAPS第十三类数据格式
此格式规定了风云二号卫星云图在MICAPS系统中的文件存储格式。该文件的头128个字节用于存储云图的基本信息,包含了时间、类型、日期、长度、宽度等信息。在128个字节后的数据格式以二进制文件方式存储,存放的是每个像素点的灰度,灰度为256级,每个像素点占用1个字节,先沿Z方向后Y方向,刚好和位图数据块存储方式相同。也就是说,这里的256级灰度,相当于位图里每个颜色的索引。例如2008年20月25日FY2C红外云图数据格式:
diamond 13              8年10月25日2时FY2C红外云图    8 10 25  2  512  512   86.59   -0.64 1 1.01 1      ir.dat   11000    3000以下是二进制文件存储方式存放的256级灰度值。

2、            MICPAS第十五类数据格式
此格式规定了MICAPS系统中调色板数据格式。文件头为:diamond 15 数据说明(字符串)。数据为:先序号,后为RGB分量(均为整数)。不同的序号的颜色用于不同的图形图像,对于云图来说,用到的是2-255号。当然,0-1背景色和传真图颜色也要用到。
例如卫星云图第四种调色板文件数据格式:
diamond 15 colorma
0   53295   61710   65535
1   0   0   0
2  2570  13107  2570
3  2570  13107  2570
4  2570  13107  2570
……

四、        VB6.0编程

1、数据声明:在了解了位图的数据结构后,对应相应的数据,进行声明。
首先定义BMP文件头(BITMAPFILEHEADER)。
Type BITMAPFILEHEADER  ‘用户自定义文件头类型
      bfType(0 to 1) As Byte  ‘BYTE数组,用于存放“BM”两个字,                                                              ‘需要化为ASCII码
     bfSize As Long  ‘位图文件大小,包括了BITMAPFILEHEADER
‘和BITMAPINFOHEADER的长度
     bfReserved1 As Integer  ‘保留字必须为0
     bfReserved2 As Integer  ‘保留字必须为0
     bfOffBits As Long  ‘位图数据距离文件头的偏移字节数
End Type
其次定义BMP文件信息头(BITMAPINFOHEADER)
Type BITMAPINFOHEADER  ‘用户自定义文件头类型
      biSize As Long  ‘BITMAPINFOHEADER的大小
      biWidth As Long  ‘位图的宽度
 biHeight As Long  ‘位图的高度
 biPlanes As Integer  ‘设备平面数,现在都是1
     biBitCount As Integer  ‘位图的颜色位数
 biCompression As Long  ‘位图的压缩方式
 biSizeImage As Long  ‘位图数据块占用字节数
 biXPelsPerMeter As Long  ‘目标设备的水平分辨率
 biYPelsPerMeter As Long  ‘目标设备的垂直分辨率
 biClrUsed As Long  ‘示使用的颜色数
 biClrImportant As Long  ‘重要的颜色数
End Type
再次设置BMP调色板(RGBQUAD)
Type RGBQUAD  ‘用户自定义文件头类型
 rgbBlue As Byte  ‘蓝色分量
 rgbGreen As Byte  ‘绿色分量
 rgbRed As Byte  ‘红色分量
 rgbReserved As Byte  ‘保留位,为0
End Type
最后,将BITMAPINFOHEADER和RGBQUAD合并在一起,就成了BITMAPINFO结构,这个结构使编写程序更加清晰。
Type BITMAPINFO  ‘用户自定义文件头类型
 bmiHeader As BITMAPINFOHEADER  ‘定义为位图文件信息头类型
 bmiColors(0 To 255) As RGBQUAD  ‘定义为256位数组,为BYTE型
End Type
以 上的定义里,程序里需要计算的也就只有bfSize和biSizeImage项。因为对于256色的位图来说,bfOffBits 和biSize都是规定好大小的,bfOffBits为14(BMP文件头字节数)+40(BMP文件信息头字节数)+1024(BMP颜色表字节 数)=1078个字节,biSize为40个字节,而其他的定义在数据结构分析里已做了说明。

2、读取MICAPS调色板
Private MySerial As Integer  ‘定义为MICAPS颜色序号
Private MicapsBlue(255) As Long  ‘定义为MICAPS蓝色分量
Private MicapsGreen(255) As Long  ‘定义为MICAPS绿色分量
Private MicapsRed(255) As Long  ‘定义为MICAPS红色分量
通过VB的内存块拷贝函数,可以高速度的将MICAPS调色板信息赋值到RGBQUAD。具体指定如下:
CopyMemory FY2Map.bmiColors(I).rgbBlue, MicapsBlue(I), 1

3、写BMP文件
以写二进制文件的方式(For Binary),将BMP文件头、BMP文件信息头、BMP
调色板顺序写入(Put),然后,以二进制文件方式,将卫星云图资料读取后(Get),顺序写入,即可得到转化后的风云卫星BMP图片。转化后的卫星云图,如图2所示。

图2  使用Windows自带的图片和传真查看器查看卫星云图
五、    结束语
本文通过分析BMP和MICAPS系统中的相关数据结构,运用VB6.0编程工具,实现了对MICAPS内的卫星云图批量转化为BMP格式的程序。同时,通过这种方式,也可以完成其他相关的图像类数据的转换和进行BMP文件定制。在本文,使用UltraEdit(UE)来进行数据分析,这对其他二进制文件也是适用的。另外,使用内存块的操作(CopyMemory),提升了程序的速度,为今后二进制文件操作提供了新的思路。

参考文献:
[1]中国气象局重点工程办公室9210工程项目组.MICAPS系统管理员手册。
[2]David F.Rogers等,计算机图形学算法基础,机械工业出版社,2002.1,第一版。

基于VB6.0的MICAPS风云二号卫星云图转化实例(转载)相关推荐

  1. plc计算机验证方案,基于VB6.0的S7-200 PLC与计算机的 - PLC实验 - 电子发烧友网

    1 引言 PLC 作为一种稳定可靠的控制器在工业控制系统得到了广泛的应用[1].但是由于中小型plc的人机接口功能不很完善,不能提供给用户一个友好的交互界面,因此妨碍了对现场运行过程的跟踪与监控[2- ...

  2. java通信rs485_基于VB6.0与485仪表的Modbus RTU通信(含代码)

    JZGKCHINA工控技术分享平台 尊重原创 勿抄袭 勿私放其他平台 前言 在写这边文章时,很纠结,到底要不要写呢?原因主要有3个:第一.VB6.0这么古老的语言现在还有人用吗?现在不是很流行C#.P ...

  3. 基于VB6.0的货架数量管理系统

    1.上位机软件使用:vb6.0:SQL SERVER2003; 2.设备包括: ①LED显示屏 ②货架 货架总计有18个仓位,每个仓位配备一个RFID读卡设备. ③232-485转换头 ④REID读写 ...

  4. 基于Tomcat5.0和Axis2开发Web Service应用实例

    本文将介绍如何使用Tomcat5.0和Apache Axis2开发.部署及测试一个简单的Web Service应用.<?xml:namespace prefix = o ns = "u ...

  5. 基于Tomcat5.0和Axis2开发Web Service代码详解

    本文将详细介绍HelloWorld中使用的server和client端代码.阅读之前,你应该首先了解SOAP1.1协议.<?xml:namespace prefix = o ns = " ...

  6. vb6.0开发的上位机串口助手(自动识别电脑端口号、支持文本、十六进制发送)

    VB是可视化的编程,就是把一些图标控件拖到编程板上,然后用代码编写每个按钮的实现功能,(如:按下按钮会发生什么事) vb在零几年的时候非常流行,近年来逐渐淡出人们的视野,但是用其来编写一些简单的上位机 ...

  7. 微信终极秘籍:精通公众号商业运营(最强作者阵容资深大号实战揭秘营销极限智慧唯一基于5.0)...

    微信终极秘籍:精通公众号商业运营(最强作者阵容资深大号实战揭秘营销极限智慧唯一基于5.0) 青龙老贼 赵黎 方雨 刘琪 潘越飞 编 ISBN 978-7-121-22036-4 2014年1月出版 定 ...

  8. 运动控制卡应用开发教程之VB6.0

    今天,正运动小助手为大家分析一下应用VB6.0开发一个总线初始化的运动控制应用. 我们主要从VB6.0的项目新建.函数库引用和PC函数使用方面讲起,最后通过项目实战--总线初始化例程讲解,来让大家熟悉 ...

  9. ESP8266的MQTT客户端搭建教程(基于NONS_SDK_v2.0)

    前言 MQTT是IBM开发的一个即时通讯协议,面向M2M和物联网的连接,采用轻量级发布和订阅消息传输机制,并且有可能成为物联网的重要组成部分. ESP8266是一款物美价廉的Wi-Fi芯片,集成Ten ...

  10. 基于BPMN2.0的工单系统架构设计(上)

    版权声明: 本文为博主原创文章,未经博主允许不得转载.关注公众号 技术汇(ID: jishuhui_2015) 可联系到作者. 一.前言 『工单系统』从宏观上看,是一些状态流的转换,笔者认为,工单系统 ...

最新文章

  1. com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1169 1024)
  2. Android开源项目分类汇总[转]
  3. 一个TreeView 样式表
  4. JavaScript 小记 之 闭包(Closures)
  5. 浏览器根据什么来判定脚本失控?
  6. 若谷歌实用量子计算机难产,拉里·佩奇会把它砍掉吗?
  7. CMS - tabBar
  8. 集群服务器分布式iis_Nginx+IIS分布式部署和负载均衡
  9. 代价敏感多标签主动学习的代码开发跟踪
  10. python面向对象编程指南 豆瓣_一文看懂Python面向对象编程(Python学习与新手入门必看)-绝对原创...
  11. oracle rollback 观察时间
  12. JavaScript中Array 对象相关的几个方法
  13. Update Remote Files 1.0
  14. A. httpd常见的几个操作
  15. Python基于wordnet实现词语相似度计算分析
  16. 国产PLM软件在创新实践中强势崛起
  17. win10右键卡顿原因_如何解决Win10桌面右键一直卡顿转圈的问题?
  18. Leetcode #1 Two Sum
  19. java 判断实体为空_Java 判断实体类属性是否为空工具类
  20. IntellijIdea2018 Liscense server激活码

热门文章

  1. 【第63期】机器人时代已来!推荐几本机器人学硬核好书
  2. opencv 视频处理相关
  3. 对HashMap进行排序处理
  4. 前端 后端 MD5加盐
  5. 智慧职教云答案在哪里找_云课堂智慧职教答案哪里找
  6. 教孩子学编程python pdf_教孩子学编程 PYTHON语言版 PDF_Python教程
  7. navicat中文破解版,navicat for mysql10.0.11简体中文破解版
  8. 电脑罗盘时钟html怎么设置成桌面,抖音最火的罗盘时钟桌面壁纸使用教程
  9. Arduino Nano与SIM800C 通信
  10. 电脑不断弹窗的解决办法