BITMAP 位图原理与简单读取

版权声明:转载请写明出处,谢谢! https://blog.csdn.net/wilson1068/article/details/88069669

BITMAP 位图原理与简单读取

Bitmap(位图,缩写BMP,又称栅格图 “Raster graphics”)或点阵图,是使用点阵来表示的图像格式。

通常来说是无压缩的图片格式,通常保存的颜色深度有 2(1 位)、16(4 位)、256(8 位)、65536(16 位)、1670 万(24位) 种颜色。

因为 BMP 通常不压缩,所以同一张图片使用 BMP 格式会比其它格式大很多。传输上基本很少采用 BMP 格式。

但是也因为其不压缩,BMP 图片与程序中操作的图片数据基本一致。

在对比图片数据的处理的结果和判断时,可以直观地转为 BMP 图片进行肉眼观察。

BITMAP 文件格式

假设一张位图存储 24 位的 RGB 颜色,那么其色深为 n = 24 n = 24 ,包含 2 n = 2 2 4 = 16777216 2^n = 2^24 = 16777216 种颜色(1670 万色),那么包含调色板的位图大小为:

(包含调色板) B I T M A P 54 + 4 × 2 n + w i d t h × h e i g h t × n 8 BITMAP 文件大小 \approx 54 + 4 \times 2 ^ {n} + \frac{width \times height \times n}{8} (字节)

当然,大部分情况我们操作中用不到调色板,所以不包含调色板的位图大小为:

B I T M A P 54 + 4 × 2 n + w i d t h × h e i g h t × n 8 BITMAP 文件大小 \approx 54 + 4 \times 2 ^ {n} + \frac{width \times height \times n}{8} (字节)

其中 width 为位图宽度(像素), height 为位图高度(像素),54 则是位图文件头大小。

BITMAP 文件头

这部分数据块位于文件开头,用于进行文件的识别。典型的应用程序会首先普通读取这部分数据以确保的确是位图文件并且没有损坏。所有的整数值都以小端序存放(即最低有效位前置)。

扫描二维码关注公众号,回复: 5384733 查看本文章
偏移量(DEC) 偏移量(HEX) 大小 用途
0 0x00 2 字节 用于标识 BMP 和 DIB 文件的魔数,一般为 0x42 0x4D,即 ASCII 的 BM。以下为可能的取值:
BM – Windows 3.1x, 95, NT, … etc.
BA – OS/2 struct Bitmap Array
CI – OS/2 struct Color Icon
CP – OS/2 const Color Pointer
IC – OS/2 struct Icon
PT – OS/2 Pointer
2 0x02 4 字节 BMP 文件的大小(单位为字节)
6 0x06 2 字节 保留;实际值因创建程序而异
8 0x08 2 字节 保留;实际值因创建程序而异
10 0x0A 4 字节 位图数据(像素数组)的地址偏移,也就是起始地址。

BITMAP 信息头

读取 BITMAP 文件需要通过解析 BITMAP 文件头(54 字节)读取图片长宽,颜色等信息。

目前 BITMAP 信息头版本基本上都是 BITMAPINFOHEADER 版本。也就是信息头大小为 40 字节(加上文件头 14 字节一共 54 字节)的。

其中的信息分布为:

偏移量(DEC) 偏移量(HEX) 大小(Byte) 用途
14 0x0E 4 该头结构的大小(40 字节)
18 0x12 4 位图宽度,单位为像素(有符号整数)
22 0x16 4 位图高度,单位为像素(有符号整数)
26 0x1A 2 色彩平面数;只有 1 为有效值
28 0x1C 2 每个像素所占位数,即图像的色深。典型值为 1、4、8、16、24 和 32
30 0x1E 4 所使用的压缩方法,可取值见下表。
34 0x22 4 图像大小。指原始位图数据的大小(详见后文),与文件大小不是同一个概念。
38 0x26 4 图像的横向分辨率,单位为像素每米(有符号整数)
42 0x2A 4 图像的纵向分辨率,单位为像素每米(有符号整数)
46 0x2E 4 调色板的颜色数,为 0 时表示颜色数为默认的 2 n 2^n
50 0x32 4 重要颜色数,为 0 时表示所有颜色都是重要的;通常不使用本项

C 语言表示位图文件头 和 信息头

typedef unsigned char   BYTE;   // 1 BYTE
typedef unsigned short  WORD;   // 2 BYTE
typedef unsigned int    DWORD;  // 4 BYTE
typedef long            LONG;   // 4 BYTE (signed)

// 14 BYTE
typedef struct tagBITMAPFILEHEADER {
    WORD   bfType;              // 文件类型,必须是0x424D,即字符"BM"
    DWORD  bfSize;              // 文件大小
    WORD   bfReserved1;         // 保留字
    WORD   bfReserved2;         // 保留字
    DWORD  bfOffBits;           // 从文件头到实际位图数据的偏移字节数
} BITMAPFILEHEADER;             // 位图文件头定义

// 40 BYTE
typedef struct tagBITMAPINFOHEADER {
    DWORD  biSize;              // 信息头大小
    LONG   biWidth;             // 图像宽度
    LONG   biHeight;            // 图像高度
    WORD   biPlanes;            // 位平面数,必须为1
    WORD   biBitCount;          // 每像素位数
    DWORD  biCompression;       // 压缩类型
    DWORD  biSizeImage;         // 压缩图像大小字节数
    LONG   biXPelsPerMeter;     // 水平分辨率
    LONG   biYPelsPerMeter;     // 垂直分辨率
    DWORD  biClrUsed;           // 位图实际用到的色彩数
    DWORD  biClrImportant;      // 本位图中重要的色彩数
} BITMAPINFOHEADER;             // 位图信息头定义

两部分一共 54 字节,之后就是图片的颜色数据了。

在读取时,请注意大小端。

猜你喜欢

转载自blog.csdn.net/wilson1068/article/details/88069669
今日推荐