首页 > 范文大全 > 正文

BMP格式位图文件的分析及显示算法

开篇:润墨网以专业的文秘视角,为您筛选了一篇BMP格式位图文件的分析及显示算法范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:bmp格式位图文件是Windows操作系统中的标准图像文件格式。在此对BMP格式位图文件的结构和内容进行了详细的分析,给出了一种简单通用、易于移植的无操作系统下BMP格式位图文件的显示算法,重点介绍了如何从位图文件中提取必要的图像信息,如何判断位图文件数据存储格式,如何获取每个像素点的颜色值,并以ARM9嵌入式开发板为实验平台实现了无操作系统下BMP格式位图文件在液晶屏上的显示。该算法也可以轻松移植到其他单片机或微处理器开发平台。

关键词:BMP; 位图文件; 显示算法; 结构分析

中图分类号:TN919-34 文献标识码:A

文章编号:1004-373X(2011)20-0005-03

Analysis of BMP Format File and Display Algorithm

SONG Ye-wei, YE Jian-fang

(College of Information Science and Technology, Donghua University, Shanghai 201620, China)

Abstract: The bitmap file (BMP format) is a standard image file format in Microsoft Windows system. The BMP file structure and content is analyzed. The display algorithm of BMP format bitmap file which is in common use and easy to transplant is offered.The extraction of the necessary image information from the bitmap file, distinguishing of the different storage format of the bitmap file, and the achievement of the color value of every pixel are elaborated emphatically. All the algorithms were tested under ARM9 embeded experimental environment and can be transported to other microprocessor environment easily.

Keywords: BMP; bitmap file; display algorithm; structure analysis

BMP格式位图文件是Windows操作系统中的标准图像文件格式,应用非常广泛。它采用位映射存储格式,这种格式的特点是包含的图像信息较丰富,几乎不进行压缩。BMP格式位图文件是一种设备无关位图,适用于无操作系统情况下的图像显示,特别是以单片机为处理器的显示平台。本文对BMP格式位图文件的结构和内容进行了详细的分析,给出了一种通用的BMP格式位图文件的显示算法,并以ARM9嵌入式开发板为实验平台实现了无操作系统下BMP格式位图文件在液晶屏上的显示。算法更加灵活智能,不像传统的无操作系统下图像显示算法那样,必须先通过软件将图像文件转换成固定的大小和格式。

1 BMP位图文件格式

1.1 文件组成

典型的BMP图像文件由4部分组成[1]:

(1) 位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;

(2) 位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;

(3) 调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;

(4) 位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他小于24位的使用调色板中颜色索引值。

1.2 各组成部分对应的文件结构

1.2.1 BMP文件头

BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。其结构定义如下:

typedef struct tagBITMAPFILEHEADER

{

WORD bfType;

//位图文件的类型,必须为BM(0~1 B)

DWORD bfSize;

//位图文件的大小,以字节为单位(2~5 B)

WORD bfReserved1;

//位图文件保留字,必须为0(6~7 B)

WORD bfReserved2;

//位图文件保留字,必须为0(8~9 B)

DWORD bfOffBits;

//位图数据的起始位置(10~13 B)

} BITMAPFILEHEADER;

1.2.2 位图信息头

BMP位图信息头数据用于说明位图的尺寸等信息。其结构定义如下:

typedef struct tagBITMAPINFOHEADER

{

DWORD biSize;

//本结构所占用字节数(14~17 B)

LONG biWidth;

//位图的宽度,以像素为单位(18~21 B)

LONG biHeight;

//位图的高度,以像素为单位(22~25 B)

WORD biPlanes;

//目标设备的级别,必须为1(26~27 B)

WORD biBitCount;

//每个像素所需的位数(28~29 B)

DWORD biCompression;

//位图压缩类型(30~33 B)

DWORD biSizeImage;

//位图的大小,以字节为单位(34~37 B)

LONG biXPelsPerMeter;

//位图水平分辨率,每米像素数(38~41 B)

LONG biYPelsPerMeter;

//位图垂直分辨率,每米像素数(42~45 B)

DWORD biClrUsed;

//位图实际使用的颜色表中的颜色数(46~49 B)

DWORD biClrImportant;

//位图显示过程中重要的颜色数(50~53 B)

}BITMAPINFOHEADER;

1.2.3 调色板

颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:

typedef struct tagRGBQUAD

{

BYTE rgbBlue;

//蓝色的亮度(值范围为0~255)

BYTE rgbGreen;

//绿色的亮度(值范围为0~255)

BYTE rgbRed;

//红色的亮度(值范围为0~255)

BYTE rgbReserved;

//保留,必须为0

}RGBQUAD;

颜色表中RGBQUAD结构数据的个数有biBitCount来确定:

当biBitCount=1,4,8时,分别有2,16,256个表项;

当biBitCount=24时,没有颜色表项。

位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:

typedef struct tagBITMAPINFO

{

BITMAPINFOHEADER bmiHeader;

//位图信息头

RGBQUAD bmiColors[1];

//颜色表

}BITMAPINFO;

1.2.4 位图数据

位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:

当biBitCount=1时,8个像素占1个字节;

当biBitCount=4时,2个像素占1个字节;

当biBitCount=8时,1个像素占1个字节;

当biBitCount=24时,1个像素占3个字节;

Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充:

biSizeImage=((((bi.biWidth*bi.biBitCount)+31)&~31)/8)*bi.biHeight;

2 BMP位图文件显示算法

2.1 宏定义

#define LCD_WIDTH 320

//液晶屏宽度(像素点)

#define LCD_HEIGHT 240

//液晶屏高度(像素点)

#define BI_RGB 0

//RGB格式

#define BI_RGB 0

//RGB格式

#define BI_BITFIELDS 3

//BITFIELDS格式

#define RGB565(r, g, b)(((U32)((r) & 0x1F)

//由R,G,B颜色分量获得RGB565格式颜色值

2.2 全局变量定义

static U32 Width;//位图宽度

static U32 Height; //位图高度

static U32 Size; //位图数据字节数

static U32 Bit_Count; //颜色深度

static U32 Compression; //压缩格式

static U32 Offset; //位图数据偏移量

static U32 Mask;

//调色板掩码,用于区分RGB565格式和RGB555格式

2.3 位图文件头解析算法

void Parse_BMP(const U8 * bmp_buffer)

{

//读取位图宽度

Width = bmp_buffer[0x15];

Width = (Width

Width = (Width

Width = (Width

//读取位图高度

Height = bmp_buffer[0x19];

Height = (Height

Height = (Height

Height = (Height

//读取位图数据字节数

Size = bmp_buffer[0x25];

Size = (Size

Size = (Size

Size = (Size

//读取颜色深度

Bit_Count = bmp_buffer[0x1D];

Bit_Count = (Bit_Count

//读取压缩格式

Compression = bmp_buffer[0x21];

Compression = (Compression

Compression = (Compression

Compression = (Compression

//读取位图数据偏移量

Offset = bmp_buffer[0x0D];

Offset = (Offset

Offset = (Offset

Offset = (Offset

//读取调色板掩码

Mask = bmp_buffer[0x39];

Mask = (Mask

Mask = (Mask

Mask = (Mask

}

2.4 判断位图文件显示格式

if(Bit_Count == 24 && Compression == BI_RGB)

{

//24位色BMP位图文件

LCD_Paint_BMP24(x, y, buffer);

}

else if(Bit_Count == 16 && Compression == BI_RGB)

{

//RGB565格式BMP位图文件

LCD_Paint_BMP16_RGB565(x, y, buffer);

}

else if(Bit_Count == 16 && Compression == BI_BITFIELDS)

{

//RGB555格式BMP位图文件

LCD_Paint_BMP16_RGB555 (x, y, buffer);

}

2.5 位图文件显示算法

显示算法[2-5]的基本原理是在液晶屏上依次画出每一个像素点。LCD画点函数定义如下[6-10]:

void LCD_Draw_Point(U32 x, U32 y, U32 color);

//在(x,y)坐标处画颜色值为color的像素点

BMP位图文件包含多种显示格式,例如单色位图、256色位图、24位位图…不同的显示格式对应的显示算法有一定差别,算法流程图如图1所示。

下面以RGB565格式BMP位图文件为例进行说明:

void LCD_Paint_BMP16_RGB565(U32 x, U32 y, const U8 * bmp_buffer)

{

U8 * pdata = (U8 *) bmp_buffer + Offset;

U16 color, r_color, g_color, b_color;

U32 i, j, width, height;

width = Width < (LCD_WIDTH - x) ? Width : (LCD_WIDTH - x);

height = Height < (LCD_HEIGHT - y) ? Height : (LCD_HEIGHT - y);

for(j = 0; j < height; j++)

{

for(i = 0; i < width; i++)

{

b_color = pdata[i * 2] & 0x1F;

g_color = ((pdata[i * 2] >> 5) | (pdata[i * 2 + 1]

r_color = (pdata[i * 2 + 1] >> 2) & 0x1F;

color = RGB565(r_color, (g_color

LCD_Draw_Point(x + i, y + height - j - 1, color);

}

pdata += ((Width * Bit_Count / 8) + 3) & ~3;

}

}

3 结 语

本文对BMP位图文件结构和内容进行了详细的分析,同时给出了一种通用的、易于移植的BMP位图文件显示算法,并以ARM9嵌入式开发板为实验平台,对算法的可行性和兼容性进行了验证。该算法可以移植到所有单片机或嵌入式开发平台,适用于无操作系统下图像的显示。

参考文献

[1]夏传良,李盛恩.多媒体图像格式间的转换方式[J].计算机应用研究,2005(10):163-187.

[2]刘海波.Visual C++数字图像处理技术详解[M].北京:机械工业出版社,2010.

[3]姚庆栋.图像编码基础[M].3版.北京:清华大学出嫔纾2006.

[4]刘直芳,王运琼,朱敏.数字图像处理与分析[M].北京:清华大学出版社,2006.

[5]阮秋琦.数字图像处理基础[M].北京:清华大学出版社,2009.

[6]陈渝,李明,杨晔.源码开发的嵌入式系统软件分析与实践[M].北京:北京航空航天大学出版社,2004.

[7]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2004.

[8]李亚锋.ARM嵌入式Linux设备驱动实例开发[M].北京:中国电力出版社,2008.

[9]佚名.S3C2440A中文数据手册[EB/OL].[2008-07-09]..

[10]飞凌嵌入式公司.S3C2440开发板硬件手册[EB/OL].[2009-03-18]..

作者简介: 宋叶未 男,1988年出生。研究方向为模式识别与智能系统。

叶建芳 女,1964年出生,副教授。研究方向为无线通信与射频系统。