我这里使用的是底层C语言,求取8位bmp文件中每个像素点的像素值。
- 8位bmp文件结构剖析:
-
1280 * 1024的8位bmp文件由位图文件头、位图信息头、调色表、颜色数据四部分组成。
-
位图文件头占14个字节,主要包括文件类型与大小等。
-
位图信息头占40个字节,主要包括位图宽、高和颜色位数等。
-
调色表占1024个字节,8位图的调色表主要包含2^8 = 256种颜色,每种颜色由BGRA(蓝、绿、红、保留位)四个元素组成,即256 * 4 =1024个字节。
-
颜色数据(DIB)扫描是从下到上,从左到右的,也就是一幅图先绘制底部的像素,在绘制顶部的像素,在8位bmp图里,每个像素点只有一个表示灰阶的值(0-255),所以无需配置每个像素点的RGB颜色,每个像素点由一个字节表示像素值。
- 操作流程:
- 模拟一个14字节的位图文件头结构体,40字节的位图信息头结构体,4字节调色表结构体。
- 以追加读的方式打开bmp文件,堆上申请一块14字节的地址,指针类型为位图文件头结构体类型,读取14字节1次到该地址。
- 堆上申请一块40字节的地址,指针类型为位图信息头结构体类型,读取40字节1次到该地址。
- 堆上申请一块1024字节的地址,指针类型为调色表结构体类型,读取1024字节1次到该地址。
- 堆上申请一个宽1280、高1024的二维数组,每个元素大小为1字节,二维数组从左下角往右上角开始读取数据,每次读取1个字节1次,循环读取,将数据保存在二维数组中。
- 关闭文件,释放手动释放堆上申请的资源。
- 代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
typedef unsigned int DWORD; // 4bytes
typedef unsigned short WORD; // 2bytes
typedef signed long LONG; // 4bytes
typedef unsigned char BYTE; // 1bytes
#pragma pack(push)
#pragma pack(1)// 修改默认对齐值
/*位图文件文件头结构体*/
typedef struct tagBITMAPF