win下单色bitmap图是由 头+信息+数据组成 其中 头占14个字节 信息占40个字节 数据在62个偏移后
这是c语言版定义的结构
typedef struct {
unsigned short signature; // 文件类型,必须为"BM"
unsigned int filesize; // 文件大小,整个文件的大小
unsigned short reserved1; // 保留字段1,一般为0
unsigned short reserved2; // 保留字段2,一般为0
unsigned int dataoffset; // 数据偏移量,即图像数据相对于文件起始处的偏移
} BMPFileHeader;
typedef struct {
unsigned int headersize; // 头信息长度,对于Windows位图,一般为40
signed int width; // 图像宽度,单位为像素
signed int height; // 图像高度,单位为像素
unsigned short planes; // 图像平面数,一般为1
unsigned short bitdepth; // 每个像素所使用的位数,一般为24
unsigned int compression; // 图像数据的压缩方式,一般为0(表示不压缩)
unsigned int imagesize; // 图像数据的实际大小,以字节为单位
signed int horizontalres; // 水平分辨率,单位为像素每米
signed int verticalres; // 垂直分辨率,单位为像素每米
unsigned int numcolors; // 所有颜色的数量,0表示使用默认取值
unsigned int importantcolors; // 重要颜色的数量,0表示所有颜色都重要
} BMPInfoHeader;
c语言版本读取位图数据
//读取bmp函数 注意!!!bmp图片大小不宜超过1M(如超过1M图片,请重新改写打印指令内存)
void bmpToByteArray(const char* filename)
{
//构建bmp文件结构体和信息结构体
BMPFileHeader BMPFileHeader;
BMPInfoHeader BMPInfoHeader;
//打开文件
FILE* file = fopen(filename, "rb"); // 以二进制只读模式打开文件
if (!file)
{
printf("无法打开文件:%s\n", filename);
return NULL;
}
//读头文件结构体数据
fread(&BMPFileHeader, 1,sizeof(BMPFileHeader), file); // 读取BMP文件头
// 移动文件指针到信息结构体
fseek(file, sizeof(BMPFileHeader), SEEK_SET);
fread(&BMPInfoHeader, 1,sizeof(BMPInfoHeader), file);
if (BMPFileHeader.signature != 0x4D42 || BMPInfoHeader.planes != 1)
{
printf("不是单色BMP图片\n");
fclose(file);
return NULL;
}
// 移动文件指针到像素数据的位置
fseek(file, BMPFileHeader.dataoffset, SEEK_SET);
// 计算像素数据所占字节数(win位图宽不足4个字节补齐4个字节)
//如果是用bitmap指令打印 如果宽度像素不是32的倍速 自动补齐部分会是一条黑线
rowSize = ((BMPInfoHeader.width + 31) / 32) * 4;
colheigth=BMPInfoHeader.height;
//数据的总字节数
dataSize = rowSize * BMPInfoHeader.height;
// 动态分配内存来存储像素数据
Bitmapdata=(char*)malloc(dataSize);
// 读取像素数据
readsize=fread(Bitmapdata,1,dataSize,file);
//关闭文件
fclose(file);
}