技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 1828|回复: 3
收起左侧

【文件格式】BMP的文件结构

[复制链接]

1044

主题

2345

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
218
威望
294 点
宅币
18324 个
贡献
37497 次
宅之契约
0 份
在线时间
1748 小时
注册时间
2014-1-26
发表于 2014-2-26 22:57:28 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
BMP文件的结构其实非常简单。BMP文件其实就是两个结构体+一个可选的调色板+位图数据。
第一个结构体是BITMAPFILEHEADER,第二个结构体是BITMAPINFOHEADER。然后就是可选的调色板(RGBQUAD数组)。最后是位图数据。
这里先讲讲BITMAPFILEHEADER的详细结构。
先看看原型。
[C] 纯文本查看 复制代码
typedef struct tagBITMAPFILEHEADER
{
        WORD        bfType;
        DWORD        bfSize;
        WORD        bfReserved1;
        WORD        bfReserved2;
        DWORD        bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
其中bfType是文件的标识,值必须是0x4D42(也就是“BM”两个字符,注意是Little-Endian)
bfSize是整个文件的大小
bfReserved1和bfReserved2必须是0.
bfOffBits是位图数据在文件中的偏移。
[C] 纯文本查看 复制代码
typedef struct tagBITMAPINFOHEADER
{
        DWORD        biSize;
        LONG        biWidth;
        LONG        biHeight;
        WORD        biPlanes;
        WORD        biBitCount;
        DWORD        biCompression;
        DWORD        biSizeImage;
        LONG        biXPelsPerMeter;
        LONG        biYPelsPerMeter;
        DWORD        biClrUsed;
        DWORD        biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;

typedef struct tagRGBQUAD
{
        BYTE        rgbBlue;
        BYTE        rgbGreen;
        BYTE        rgbRed;
        BYTE        rgbReserved;
} RGBQUAD;
biSize:
BITMAPINFOHEADER这个结构体的大小。必须为40(字节)。

biWidth:

BMP位图的宽度。

biHeight:
BMP位图的宽度。
这里需要说明一下的是,BMP位图数据有两种存储方式,通常是“底到上型”,也就是BMP位图数据的第一行其实是这个图片的最后一行。
一种是“顶到下型”,BMP位图数据的第一行就是图片的第一行。
如果位图是“顶到下型”,那么biHeight的值是负的,位图的实际高度其实是(-biHeight),也就是它的相反数。
只有“底到上型”位图支持压缩。“底到上型”是目前最常见的位图类型。
PhotoShop在保存位图文件的时候,你可以设置让它输出“底到上型”或“顶到下型”。“顶到下型”就是“逆行序”。


biPlanes:

位图的“位面数”。这个值必须为1.

biBitCount:

位图的“颜色位数”。表示位图数据中,几个二进制位表示一个像素。
颜色位数为1表示色(其实是“双色”,通常是黑白,也可以是别的两个颜色。)
2表示色,也就是四种颜色。为4表示16种颜色。为8表示有256种颜色。
在表示256色以内的颜色数量的时候,这个BMP文件其实是作为使用调色板颜色的图像,因此在BITMAPINFOHEADER结构体的后面还有个调色板。
所谓调色板其实就是RGBQUAD结构体的数组。它的元素个数就是颜色数。
目前为止,我还没听说过biBitCount的值可以是3567这些值。不过说不定这样的位图是存在的。事实上这样的位图不应该说“不合法”。
biBitCount为16的时候,表示位图是“高彩色”位图,有65536种颜色。但是这个时候的位图就是不使用调色板的了。
位图数据中的红、绿、蓝三基色的数据被压缩到16个二进制位存储在两个字节里(可以当做WORD型),
每两个字节表示一个像素。通常按照5:6:5的位数表示红、绿、蓝,但是也有不同的(1:5:5:5等),取决于位图的屏蔽位数据
biBitCount为24的时候,表示位图是“真彩色”位图,有16777216种颜色。同样,这样的位图也是不使用调色板的。
位图数据中,红、绿、蓝三基色各占1字节,也就是红色占1字节,绿色占1字节,蓝色占1字节,每个像素3字节。

biBitCount为32的时候,位图是带透明通道的真彩深色位图(非常罕见)或者红绿蓝颜色被扩展成更高的位数(取决于位图的屏蔽位数据)。要说的话,也可以说有4294967296种颜色。
位图数据中,红、绿、蓝、不透明度四个部分各占一字节。每个像素4个字节。


biCompression:

位图的压缩格式,值可以是BI_RGB(未压缩),BI_RLE8(8位RLE压缩),BI_RLE4(4位RLE压缩),BI_BITFIELDS(表示颜色表中,每个像素有3个DWORD的屏蔽位数据来指示红绿蓝成分。16位和32位位图可以使用这个。),BI_JPEG(位图数据其实是JPG格式的),BI_PNG(位图数据其实是PNG格式的)。压缩算法回帖可见。
游客,如果您要查看本帖隐藏内容请回复

biSizeImage:
位图数据块的大小。以字节为单位。如果你的位图没有经过压缩,这个值可以是0.

biXPelsPerMeter:

表示横向的每米的像素数。可以为0.

biYPelsPerMeter:

表示纵向的每米的像素数。可以为0.

biClrUsed:

位图实际使用过的调色板的颜色数。如果这个值为0,表示这个位图使用了整个调色板。只有8位以及8位以下的索引颜色位图才需要考虑这个值。对于16位以及16位以上的位图,无视这个值。biClrImportant表示重要的颜色数。如果为0,表示颜色都重要。通常它的值等于biClrUsed,或者等于0.

如果位图是8位以及8位以下的位图,后面是位图的调色板数据。否则没有调色板数据。
调色板就是简单的RGBQUAD数组。

后面就是位图数据了。如果位图是没有经过压缩的,那么位图数据的存储就是一行一行的,每行都是每XX个字节一个像素,取决于位图的位数(biBitCount),每一行都是4字节对齐的!多出来的部分用0补齐。这里必须注意。
因此,每行占用的字节数要按照以下公式计算:(其中的biBitCount指的是位图的位数,也就是BITMAPINFOHEADER的成员
每行字节数 = ((图像宽度 - 1) * biBitCount / 32 + 1) * 4;
如果你是用VB编写读取位图的话,是这样写的:
每行字节数 = ((图像宽度 - 1) * biBitCount \ 32 + 1) * 4
这里还要注意的是“到上型”位图和“到下型”位图,如果BITMAPINFOHEADER的biHeight成员大于零,那么这个位图就是“底到上型”,否则就是“顶到下型”。“底到上型”的位图,它的行序是从下到上排列的,也就是逆行序。“顶到下型”位图行序是从上到下排列的。


4

主题

29

帖子

285

积分

用户组: 版主

UID
32
精华
0
威望
6 点
宅币
244 个
贡献
0 次
宅之契约
0 份
在线时间
45 小时
注册时间
2014-2-7
发表于 2014-2-27 19:20:53 | 显示全部楼层
系统自动沙发,有意见请拨110

0

主题

1

帖子

9

积分

用户组: 初·技术宅

UID
5343
精华
0
威望
0 点
宅币
8 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2019-10-5
发表于 2019-10-5 00:46:33 | 显示全部楼层
回复求收看,谢谢楼主。

1

主题

28

帖子

149

积分

用户组: 小·技术宅

UID
2054
精华
0
威望
2 点
宅币
117 个
贡献
0 次
宅之契约
0 份
在线时间
18 小时
注册时间
2016-11-10
发表于 2019-10-8 06:18:52 | 显示全部楼层
回帖看压缩算法

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2019-11-12 19:09 , Processed in 0.104326 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表