bmp图片文件包含4个部分数据,位图文件头,位图信息头,颜色表和位图数据(即RGB值)。

在看位图格式之前先看一个问题,如果每个像素都用前面的24位色去表示,那么一个像素值需要3个字节数据,24位色也称为真彩色,因为它能表示足够多的颜色。但是要是我们不需要这么多颜色呢,比如我只需要16种颜色就行了,如果还是按照3个字节来表示一个像素,一个640*480位图需要640*480*3共约765k的像素数据。其实完全没有必要这么做,我们可以这样,16种颜色定义一个表,每一种颜色对应表中的一组RGB值,当要表示一个像素值时,指定表中的一个索引,从表中取出来显示即可,16种颜色只需要4位数据即可,再加上颜色表所占的空间3*16,这样一张640*480图片仅需要640*480*0.5+3*48共150k多数据,减少了近4/5的数据。这张R、G、B表称为调色板(palette),位图就采用了调色板技术。调色板技术一般用于颜色需求比较少的情况下,如果时24位色,大家可以算以下,比不用调色板技术像素数据还要多。

位图文件头(BITMAPFILEHEADER)共14个字节,包含如下内容:

typedef struct tagBITMAPFILEHEADER { /* bmfh */

UINT bfType;

DWORD bfSize;

UINT bfReserved1;

UINT bfReserved2;

DWORD bfOffBits;

}BITMAPFILEHEADER;

位图文件类型(bfType),2个字节,必须是BM的ASCII码值,即0x4D42

位图文件大小(bfSize),4个字节,包括这14个字节

保留区(bfReserved1,bfReserved2),4个字节

文件头到实际位图像素数据的偏移大小(bfOffBits),4个字节

位图信息头BITMAPINFOHEADER,共40字节,包含如下内容:

typedef struct tagBITMAPINFOHEADER { /* bmih */

DWORD biSize;

LONG biWidth;

LONG biHeight;

WORD biPlanes;

WORD biBitCount;

DWORD biCompression;

DWORD biSizeImage;

LONG biXPelsPerMeter;

LONG biYPelsPerMeter;

DWORD biClrUsed;

DWORD biClrImportant;

}BITMAPINFOHEADER;

biSize,指定BITMAPINFOHEADER结构大小,占4个字节,为40

biWidth,指定位图宽度,单位为像素,占4个字节,例如640*480图片,这里值就为640

biHeight,指定位图高度,占4个字节,例如前面的480

biPlanes,占2个字节,必须为1

biBitCount,指定像素位数,占2个字节,比如24位色这里就为24,16位色这里就为16,1位色这里就为1,居然有1为色,就是黑白照片。

biCompression,指定位图的压缩类型,可以取如下值:BI_RGB、BI_RLE8、BI_RLE4,都是windows定义好的一些常量,BI_RGB表示不压缩

biSizeImage,图片像素数据大小,单位为字节,如果图片是BI_RGB,那么这个字段可以设置为0

biXPelsPerMeter,目标设备水平分辨率

biYPelsPerMeter,目标设备垂直分辨率

biClrUsed,指定位图实际用到的颜色数,如果为0,颜色数为2^biBitCount

biClrImportant,指定重要颜色数,如果为0,表示所有颜色都是重要的。

调色板RGBQUAD,对于真彩位图不是必须的,BITMAPINFOHEADER就是图像的像素数据。

typedef struct tagRGBQUAD { /* rgbq */

BYTE rgbBlue;

BYTE rgbGreen;

BYTE rgbRed;

BYTE rgbReserved;

}RGBQUAD;

调色板中一组颜色数据,rgbBlue表示蓝色分量值,rgbGreen表示绿色分量值,rgbRed表示红色分量值,rgbReserved保留,必须为0。

剩下的就是像素数据了,对于用到调色板的位图,图像数据就是该像素在调色板中的索引值,对于真彩色图,就是实际的RGB值。

需要注意的是:

1.每一行的字节数必须是4的整数倍,如果不是,则需要补齐。

2.bmp文件的像素数据是从下到上,从左到右的,也就是说bmp文件数据的第一行其实是图片的最下面一行数据。

3.每个像素的数据是蓝色分量在前,红色分量在最后,是BGR这样排列的,和RGB的叫法是相反的。

bmp图像文件格式说明相关推荐

  1. 【转】BMP图像文件格式

    5.1  BMP图像文件格式 BMP图像文件格式是游戏中常用的图像资源文件格式,BMP图像文件起源早,程序员对BMP都比较熟悉,再加上BMP格式简单,读取和写入非常容易实现,所以无论Windows的还 ...

  2. BMP图像文件格式分析附带图解

    From: http://www.raidcn.com/js/BMPTuXiangWenJianGeShiFenXiFuDaiTuJie.html 认识BMP文件格式,以及bmp文件存储结构 ,通过w ...

  3. .net core image怎么保存_C# 将PDF转为多种Image图像文件格式(Png/Bmp/Emf/Tiff)

    PDF是一种在我们日常工作学习中最常用到的文档格式之一,但常常也会因为文档的不易编辑的特点,在遇到需要编辑PDF文档内容或者转换文件格式的情况时让人苦恼.通常对于开发者而言,可选择通过使用组件的方式来 ...

  4. BMP(图像文件格式(Bitmap))

    BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广.它采用位映射存储格式,除了图像深度可选以外,不采用其他 ...

  5. JPG、PNG、BMP、RAW傻傻分不清楚?一文帮你解析常见的图像文件格式及其差异

    https://www.sohu.com/a/468617858_120293876 文章目录 第1部分.什么是图像文件 第2部分.JPG vs JPEG vs JPEG 2000 1.什么是JPEG ...

  6. Tencent QQ皮肤图像文件格式Gft转png或bmp源代码

    Tencent QQ皮肤图像文件格式Gft转png或bmp源代码 转载自CSDN,另附Delphi版代码: http://topic.csdn.net/u/20111121/14/E545FC21-4 ...

  7. C# 如何将PDF转为多种图像文件格式(Png/Bmp/Emf/Tiff)

    PDF是一种在我们日常工作学习中最常用到的文档格式之一,但常常也会因为文档的不易编辑的特点,在遇到需要编辑PDF文档内容或者转换文件格式的情况时让人苦恼.通常对于开发者而言,可选择通过使用组件的方式来 ...

  8. C语言读取bmp图像并做简单显示

    C语言读取bmp图像并做简单显示) bmp文件格式 读取bmp文件信息并展示 bmp文件格式 bmp文件大体上分为四个部分: bmp文件构成 位图文件头BITMAPFILEHEADER 位图信息头BI ...

  9. [VC6] 图像文件格式数据查看器

    在今天较少有情况需要去研究图像的文件格式,除非某些特定场合.在这里我还是去先做了这样一个小工具,目前已经支持展示BMP, ICO, CUR文件格式内容.实际上只要你知道一个文件的格式定义,你就可以去展 ...

最新文章

  1. VBScript中InStr函数的用法
  2. R语言str_extract函数从字符串中抽取匹配模式的字符串
  3. Jenkins:配置信息变更历史
  4. TextView显示不同颜色的文本,及文本变色可点击工具类
  5. 学Java需要什么技巧呢?分享这4个
  6. 小米redmi_99.9元!Redmi首款智能手环评测:能“打赢”小米手环5吗?
  7. java 中数组与list_Java中List与数组相互转换实例分析
  8. 为什么我不推荐敏捷开发?
  9. 早上起床后喝的第一杯水不要喝太多
  10. java i o是什么流_Java I/O 流,输入流、输出流
  11. 深度学习赋能侧信道攻击
  12. 编曲软件FL Studio 20.99中文版2023最新免费下载
  13. 板凳——————————————————c++(104)
  14. Python自动化体系学习思维导图、知识点整理
  15. 公告栏文本横向循环滚动
  16. mysql reconnect_在设置了MYSQL_OPT_RECONNECT之后,mysql_ping是否还有必要?
  17. 麒麟信安邀您抢先看 | openEuler 志高远,开源汇智创未来-开放原子全球开源峰会欧拉分论坛最详细议程出炉
  18. 电子警察是属于计算机应用中的,计算机应用基础测试题.doc
  19. 常用遥感卫星数据汇总
  20. PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

热门文章

  1. Python爬虫之PyQuery
  2. 程序员为程序员推荐:我觉得这本书不错,分享给你
  3. 怎么查看CAD图纸并更改图纸背景颜色?
  4. EFR32BG22性能
  5. 身份证人脸认证接口是如何识别网络诈骗?
  6. 微信拟推付费云存储 八成网友说:不!
  7. Windows-CMD常用命令总结
  8. 三个基本的布尔逻辑算符是_什么是布尔逻辑运算符?布尔逻辑运算符一共有哪几种?...
  9. 解决xshell6强制更新
  10. .net 发短信案例