当前位置:首页 > 公众号精选 > strongerHuang
[导读]BMP文件的结构其实非常简单,就是两个结构体+一个可选的调色板+位图数据。

关注+星标公众,不错过精彩内容

编排 | strongerHuang

微信公众号 | strongerHuang


BMP文件的结构其实非常简单,就是两个结构体+一个可选的调色板+位图数据。

第一个结构体是BITMAPFILEHEADER,第二个结构体是BITMAPINFOHEADER。然后就是可选的调色板(RGBQUAD数组)。最后是位图数据。

嵌入式专栏

1

第一个结构体
这里先讲讲第一个结构体位图文件头结构:BITMAPFILEHEADER 的详细结构。

先看看代码原型:
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 :是位图数据在文件中的偏移。

嵌入式专栏

2

第二个结构体
位图信息头:BITMAPINFOHEADER。
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;

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结构体的数组。它的元素个数就是颜色数。


biCompression:
位图的压缩格式,值可以是BI_RGB(未压缩),BI_RLE8(8位RLE压缩),BI_RLE4(4位RLE压缩),BI_BITFIELDS(表示颜色表中,每个像素有3个DWORD的屏蔽位数据来指示红绿蓝成分。16位和32位位图可以使用这个。),BI_JPEG(位图数据其实是JPG格式的),BI_PNG(位图数据其实是PNG格式的)

当biCompression值为BI_RLE8的时候,biBitCount必须为8,表示这是个8位的256色索引颜色位图(有256个调色板),位图数据按照如下算法压缩:

·位图数据是每两个字节组成一个元素,这样的元素组成了一个数组。

·每个元素,第一个字节表示重复的像素的数量,第二个字节是8位的调色板颜色索引。

·如果元素的第一个字节为0,那么第二个字节有特殊的含义:

0:这行已经结束了。

1:这个位图已经结束了。

2:设置下一个像素的位置,后面的两个无符号字节分别指定了下一个像素的X、Y偏移。注意是无符号字节,意思是说,偏移只能是往后。

3到0xFF:表示后面有一段没有压缩的数据的长度,也就是连续的8位像素颜色索引数据的长度。但是数据必须是2字节对齐的。biCompression值为BI_RLE4的时候,biBitCount必须为4,表示这是个4位的16色索引颜色位图(有16个调色板)。

和BI_RLE8的区别只是每个元素的第二个字节如果表示颜色索引,它表示的是两个像素的颜色索引。第一个字节表示重复的数量,第二个字节表示两个像素的颜色。

举个例,假设调色板第0号色是黑色,第1号色是白色,元素的值是0x05,0x01,那么它表示“黑白黑白黑白黑白黑白”共10个像素出现在1行。


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成员大于零,那么这个位图就是“底到上型”,否则就是“顶到下型”。“底到上型”的位图,它的行序是从下到上排列的,也就是逆行序。“顶到下型”位图行序是从上到下排列的。

嵌入式专栏

3

位图颜色表
位图颜色表就比较简单了:
typedef struct tagRGBQUAD{ BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved;} RGBQUAD;

红禄蓝三种颜色,然后还有保留一个字节。

最后,还有位图数据,这里就不描述了。

免责声明:本文部分素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除

------------ END ------------


推荐阅读:

精选汇总 | 专栏 | 目录 | 搜索

C语言printf()函数具体解释和安全隐患

单精度、双精度、多精度和混合精度计算的区别是什么?


关注 微信公众号『嵌入式专栏』,底部菜单查看更多内容,回复“加群”按规则加入技术交流群。


点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭