一、需求分析:
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
分享到:
相关推荐
步骤:(1) 读取文件信息,以二进制方式打开并读取位图文件信息复制给新的变量后关闭文件;...(5) bmp数据存储时按行从左到右、按列从下到上扫描,所以对于24位bmp文件,数据区前三个字节代表位图左下角第一个元素;
BMP位图文件解析 PDF文档 内涵 解码过程说明 不是完整的源码
大学时用c语言写的解析bmp位图的源码,其实很简单,建一个结构体读进去就行了。
16进制dat数据转.bmp位图文件图片 源码: //dat数据转换为bmp图片(位图),并存入到指定名称的图片; //dat数据(my.dat)与当前程序文件在同一文件夹,"my.dat"为包含文件头的完整的位图数据,可以下载参考我的另外一个...
读取一个标准的24位真彩色BMP文件,然后转化为灰色图像,最后存储为8位BMP文件。
c++源代码 实现bmp位图文件的读取与保存 二进制方法读取bmp的像素信息
1:BMP由四部分组成:BMP文件头(14字节)、位图信息头(40字节)、颜色表、位图数据。 2:BMP文件头(14字节) BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。 其结构定义如下: typedef ...
VC中保存BMP位图文件的方法及BMP文件格式带源码实现[文].pdf
压缩文件提供: 1. bmp位图文件详细格式分析; 2. bmp位图文件打开,读取功能; 3. bmp位图文件写入,保存功能; 4. bmp位图文件显示到指定控件(如,picture控件上);
通过读取bmp格式文件的数据格式,用数组合理的读取后,重新画出该图片
实现目录下BMP位图文件批量转换为JPG格式图片文件
按文件读取BMP位图,注意仅仅对24位位图有效。
一、BMP文件分析 1. 什么是BMP(位图)? 常见的图像文件格式有:BMP、JPG(JPE,JPEG)、GIF等。 BMP图像文件(Bitmap-File)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。...
简洁明了的介绍了BMP位图格式,以及获取不同位图颜色分量的方式。
bmp位图文件的读取与保存
Vb旋转BMP位图,图像旋转演示源码,完成垂直翻转、水平翻转、90度(逆时针)、90度(顺时针)、180度等,仅对BMP位图支持比较好。
bmp位图文件的读取与保存 bmp位图文件的读取与保存,可以借此熟悉bmp的文件结构
位图转数据(bmp图片转dat数据)源码; //bmp图片(位图)转换为dat数据,并存入到指定文件中; //若需将.dat数据在转换回位图.bmp文件,可以下载参考我的另外一个文档"data_bmp.c" //运行参考:./main infile.bmp outfile...
BMP位图文件结构