前言
平时网络上有非常多类型的图片,最常见的就是png与jpg类型,但由于它们内部做了很多算法的处理、对图片数据进行了一定程度的压缩,所以并不适合一开始就拿来学习。
而本文要介绍的BMP图片,便是一种非常原始的图片格式,它将每个像素的数据都完整的保存了下来,非常适合新手学习。
BMP格式概览
BMP文件格式还是比较简单的,总共分为四部分:
BITMAPFILEHEADER结构体,BITMAPINFOHEADER结构体,RGBQUAD结构体(这个结构体可以有,也可以没有),DIB数据区。(Device-Independent Bitmap,设备无关位图)。
在继续探究这些格式之前,我们还需要明白一个概念,即:RGB(Red,Green,Blue)三原色,我们图片中的像素就是用这三种颜色构成的
我们常看到的8位色,16位色,24位色和32位色这些,实际指的就是用多少位来表示一个颜色(又称位深度)
位指的是二进制的一位,一个字节(char)有8位:

以8位色为例,即一个char,可以表示的范围为:0 - 2<sup>8</sup>-1,即256种颜色,如果是1位色,那就只能表示两个颜色,即黑白图片。
目前主流的是24位色和32位色,所以这里不讨论8位数和16位色
事实上第三个结构体RGBQUAD就是为8位、16位色等较低位数准备的,使用起来也更麻烦。
本文以24位色为主。即RGB三原色,各占8位大小,即各占一个字节。
如果是32位,则RGB三原色各占8位,还剩下8位用于描述透明度的,即:rgba最后的a,Alpha透明度。
综上,我们需要了解的就只有前两个结构体,和最后的DIB数据区了。这里的结构体定义是 Windows API 的写法,不能直接假设在所有编译器、平台上都没有填充字节;实际解析文件时应按 BMP 规定的字段大小和偏移读取,并注意 BMP 使用小端序。
首先来看第一个结构体定义:
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //图片种类,BMP图片固定为BM,表示为十六进制就是0x4d42
DWORD bfSize; //该图片文件的大小
WORD bfReserved1; //保留字,不用管
WORD bfReserved2;//保留字,不用管
DWORD bfOffBits; //实际图片数据的偏移量,即`DIB`的偏移量,也即前三个结构体的大小
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
请开通后继续阅读后续 70% 并运行完整示例~
DISCUSSION
评论 0
还没有评论,来留下第一条吧。