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结构大小,占两个字节,为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. C# 如何将PDF转为多种图像文件格式(Png/Bmp/Emf/Tiff)

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

  3. BMP头文件格式以及C语言读取头文件【转】

    BMP头文件格式以及C语言读取头文件[转] (2011-12-24 22:59:17) 转载▼ 标签: 杂谈 分类: 各个领域的知识 BMP图像文件由三部分组成:位图文件头数据结构,它包含BMP图像文 ...

  4. BMP图像数据格式详解

    一.简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式.Windows系统内部各图像绘制操作都是以B ...

  5. 【转】PNG图像文件格式

    5.2  PNG图像文件格式 PNG是可携式网络图像(portable network graphics)的英文缩写.PNG是从网络上开始发展的,目的是替代GIF和JPG格式,PNG图像文件格式也是当 ...

  6. BMP图像直方图均衡算法(C语言大作业)

    万丈高楼平地起 C语言大作业 一.学习笔记篇 1.学习MarkDown MarkDown注重写作本身,而非花俏的界面 编辑器:vscode 插件:Markdown,Markdown Preview 2 ...

  7. 远程控制编写之屏幕传输 MFC实现 屏幕截图 发送bmp数据 显示bmp图像

    远程控制编写之屏幕传输  MFC实现  屏幕截图 发送bmp数据 显示bmp图像: 一 : 首先要了解bmp图像的结构 详情请看我转载的一篇文章http://blog.csdn.net/hnust_x ...

  8. MFC显示bmp图像

    有了bmp文件读写的基础,我们就能够開始用MFC显示BMP图片了. 在这里,事实上微软为我们提供了一个实现bmp文件显示的框架,名叫diblook,我们能够先下载下来看看. 以下上链接:DIBLOOK ...

  9. 读取BMP图像size的时候与操作和左移的原因

    在读取一个bmp图像的时候,我们会将它的大小读取出来,如果还不清楚bmp的文件结构,那就先看一下这篇博客. 看完我将假设你已经明白所表示的意义.那么,对于bfSize, 它的表示数字为 50 00 0 ...

随机推荐

  1. C/C++的const区别

    1.const基础知识(用法.含义.好处) int main() { const int a; //a为const,常数型数 int const b; //b为const,常数型数 const int ...

  2. UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数

    一.IPv4与IPv6的互操作性 1.IPv4客户与IPv6服务器 拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户.这是通过使用IPv4映射 ...

  3. bzoj2875随机数生成器——矩阵快速幂

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2875 矩阵快速幂,把x和c分开求,最后加上即可: 为防止爆long long,要用快速乘. ...

  4. Linux设备驱动之Kobject、Kset

    作者:lizuobin(也是我们兼职的论坛答疑助手) 原文: https://blog.csdn.net/lizuobin2/article/details/51523693 纠结又纠结,虽然看了一些 ...

  5. NHibernate错误:Could not compile the mapping document的解决

    用动软代码生成器的NHibernate生成模板,生成一个“XML映射模板”,老是提示Could not compile the mapping document的问题. 各种的找,就是没找到问题. 后 ...

  6. CentOS 6 命令行下安装 VirtualBox 虚拟机步骤

    CentOS 6 命令行下安装 VirtualBox 虚拟机步骤 1. 准备工作 安装内核更新 yum install kernel-develyum update kernel*如果内核有更新,则需 ...

  7. mfc为对话框添加启动画面

    新建CwzdSplash类 CwzdSplash.h #pragma once class CWzdSplash : public CWnd { DECLARE_DYNAMIC(CWzdSplash) ...

  8. Spring中JdbcTemplate的基础用法

    Spring中JdbcTemplate的基础用法 1.在DAO中使用JdbcTemplate 一般都是在DAO类中使用JdbcTimplate,在XML配置文件中配置好后,可以在DAO中注入即可. 在 ...

  9. swift日期操作

    简介:本文将介绍一些关于swift中对于日期的格式化与获取,支持swift4.0 extension Date { //格式化日期 func getDateString() -> String{ ...

  10. ssl 证书申请

    https(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 http 通道,简单讲是 http 的安全版.即 ht ...