`
smallsmile
  • 浏览: 133849 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java关于BMP位图文件解析的分析与实现[源码][附图]

阅读更多
一、需求分析:
BMP是一种与硬件设备无关的图像文件格式,使用非常广。BMP是Windows环境中交换与图有关的数据的一种标准,在Windows环境中运行的图形图像软件都支持BMP图像格式。
学习解析WINDOWS文档是一个合格程序员必须具备的能力,对于初学者来说,解析BMP文件是一个不错的选择。
二、概要设计:
针对需求分析,查阅BMP文档的编码规则可知:
位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。
位图文件的组成 结构名称 符号
位图文件头(bitmap-file header) BITMAPFILEHEADER bmfh
位图信息头(bitmap-information header) BITMAPINFOHEADER bmih
彩色表(color table) RGBQUAD aColors[]
图象数据阵列字节 BYTE aBitmapBits[]
表01 位图文件结构内容摘要
  偏移量 域的名称 大小 内容
 
 
 
图象文件
头 0000h 文件标识 2 bytes 两字节的内容用来识别位图的类型:
‘BM’ : Windows 3.1x, 95, NT, …
‘BA’ :OS/2 Bitmap Array
‘CI’ :OS/2 Color Icon
‘CP’ :OS/2 Color Pointer
‘IC’ : OS/2 Icon
‘PT’ :OS/2 Pointer
注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识“BM”就行。
  0002h File Size 1 dword 用字节表示的整个文件的大小
  0006h Reserved 1 dword 保留,必须设置为0
  000Ah Bitmap Data Offset 1 dword 从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量
  000Eh Bitmap Header Size 1 dword 位图信息头(Bitmap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:
28h - Windows 3.1x, 95, NT, …
0Ch - OS/2 1.x
F0h - OS/2 2.x
注:在Windows95、98、2000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。
  0012h Width 1 dword 位图的宽度,以象素为单位
  0016h Height 1 dword 位图的高度,以象素为单位
  001Ah Planes 1 word 位图的位面数(注:该值将总是1)

图象
信息

 
  001Ch Bits Per Pixel 1 word 每个象素的位数
1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)
4 - 16 色位图
8 - 256 色位图
16 - 16bit 高彩色位图
24 - 24bit 真彩色位图
32 - 32bit 增强型真彩色位图
  001Eh Compression 1 dword 压缩说明:
0 - 不压缩 (使用BI_RGB表示)
1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)
2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)
3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)
  0022h Bitmap Data Size 1 dword 用字节数表示的位图数据的大小。该数必须是4的倍数
  0026h HResolution 1 dword 用象素/米表示的水平分辨率
  002Ah VResolution 1 dword 用象素/米表示的垂直分辨率
  002Eh Colors 1 dword 位图使用的颜色数。如8-比特/象素表示为100h或者 256.
  0032h Important Colors 1 dword 指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
调色板数据 根据BMP版本的不同而不同 Palette N * 4 byte 调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:

1字节用于蓝色分量

1字节用于绿色分量

1字节用于红色分量

1字节用于填充符(设置为0)

图象数据 根据BMP版本及调色板尺寸的不同而不同 Bitmap Data xxx bytes 该域的大小取决于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。





    各个功能通过各自的类来完成。
三、详细设计:
1、出于程序复杂性等原因的考虑,本程序仅可解码不压缩的BMP文件,支持24,8,4,1bpp的文档。
2、程序对文件输入流FileInputStream进行了DataInputStream的封装,可使之直接读4位、2位的数据。
3、程序运用了大量的位运算等,可取得读得某字节的各位的数据。
四、程序结构
1、程序结构说明:
本程序采用模块化设计方法,各个功能的实现都有具体的方法,在主函数调用相应的方法即可实现程序的要求。程序的整体性很强。
2、重要数据说明:
本程序中定义UserColor 类,来存放颜色数据,有三个属性为red,blue,green.
3、函数清单:
/**
*定义一个解码BMP的方法
**/
public void showJieMa()

    //定义一个解码bpp=1的文件的方法
public void readRGB1(int width,int height,DataInputStream dis)
   //定义一个解码bpp=4的文件的方法
public void readRGB4(int width,int height,DataInputStream dis)
//定义一个解码bpp=8的文件的方法
public void readRGB8(int width,int height,DataInputStream dis)
//定义一个解码bpp=24的文件的方法
public void readRGB24(int width,int height,DataInputStream dis)


五、调试分析:
1、程序截图:



2、程序调试
在调试中发现文件的某个地方多读或少读一个数据会造成整个文件的读取错误。
同时,发现在VISTA系统下,建立的BMP文件解析后会出现图会的倾斜与变色,具体原因为bmp的偏移字段解析问题。

六、总结:
1、程序设计难点:
本程序的难点在于读得字节中各个位的提取及运算。
2、程序设计中的不足:
本程序功能上还没有做到完全将各种BMP文件解析出来,而且解析效率很低,对于大点的图像解析会很慢。
3、训练体会:
这次训练使我增强了对于文件的读取以及FileInputStream、DataInputStream等的认识。
同时,熟悉了对字节数据位运算的一些操作。
同时,在程序中,遇到了if, else语句的使用错误,导致了整个程序的瘫痪,在今后的软件、程序设计过程中,应注意这方面的问题,可以自己对这些语句摸拟运行一下来确定其的正确性。
  • 大小: 12.1 KB
  • 大小: 18.4 KB
  • src.rar (4.2 KB)
  • 描述: 源码
  • 下载次数: 168
分享到:
评论
1 楼 fishflyinsky7 2013-07-12  
谢谢分享,研究下先

相关推荐

Global site tag (gtag.js) - Google Analytics