BMP文件学习笔记(一): C/C++语言实现.bmp文件读写 您所在的位置:网站首页 图像头文件的作用是什么 BMP文件学习笔记(一): C/C++语言实现.bmp文件读写

BMP文件学习笔记(一): C/C++语言实现.bmp文件读写

2023-10-02 12:15| 来源: 网络整理| 查看: 265

1 认识BMP文件

bmp文件结构:

第一部分:位图文件头BITMAPFILEHEADER,是一个结构。这个结构的长度是固定的,为14个字节(WORD为无符号16位整数,DWORD为无符号32位整数)。

其定义如下: typedef struct tagBITMAPFILEHEADER { WORD           bfType;//位图文件类型,必须是0x4D42,即字符串“BM”,也就是说所有.bmp文件的头两个字节都是“BM” DWORD        bfSize;//位图文件大小,包括这14个字节 WORD           bfReserved1;//保留字,设为0 WORD           bfReserved2;//保留字,设为0 DWORD        bfOffBits;//从文件头到实际的位图数据的偏移字节数,单位:字节 } BITMAPFILEHEADER;

第二部分:位图信息头BITMAPINFOHEADER,是一个结构。这个结构的长度也是固定的,为40个字节(LONG为32位整数)。

其定义如下:

typedef struct tagBITMAPINFOHEADER{ DWORD        biSize;//本结构所占用字节数,大小为40字节 LONG            biWidth;//位图宽度,单位:字节 LONG            biHeight;//位图高度,单位:字节 WORD           biPlanes;//目标设备级别,必须为1 WORD           biBitCount;//表示颜色时每个像素要用到的位数,常用的值为1(黑白二色图), 4(16色图), 8(256色), 24(真彩色图) DWORD        biCompression;// 位图是否压缩,其类型是 0(BI_RGB不压缩),  1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型) DWORD        biSizeImage;//实际的位图数据占用的字节数 LONG            biXPelsPerMeter;//位图水平分辨率,每米像素数 LONG            biYPelsPerMeter;//位图垂直分辨率,每米像素数 DWORD        biClrUsed;//指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次幂个 DWORD        biClrImportant;//指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的 } BITMAPINFOHEADER;

第三部分:调色板Palette。这里是对那些需要调色板的位图文件而言的,有些位图,如真彩色图,是不需要调色板的,BITMAPINFOHEADER后直接是位图数据。 调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有2的biBitCount次幂个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下: typedef struct tagRGBQUAD { BYTE    rgbBlue; //该颜色的蓝色分量(值范围为0-255)   BYTE    rgbGreen; //该颜色的绿色分量(值范围为0-255)  BYTE    rgbRed; //该颜色的红色分量(值范围为0-255)  BYTE    rgbReserved; //保留值,设为0 } RGBQUAD; 第四部分:实际的图象数据。对于用到调色板的位图,图象数据就是该象素颜在调色板中的索引值。对于真彩色图,图象数据就是实际的R、G、B值。 对于2色位图,用1位就可以表示该象素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个象素。 对于16色位图,用4位可以表示一个象素的颜色,所以一个字节可以表示2个象素。 对于256色位图,一个字节刚好可以表示1个象素。 对于真彩色图,三个字节表示1个象素。 注意: (1)    每一行的字节数必须是4的整倍数,如果不是,则需要补齐。这在前面介绍biSizeImage时已经提到了。 (2)    一般来说,.bMP文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个象素,然后是左边第二个象素……接下来是倒数第二行左边第一个象素,左边第二个象素……依次类推 ,最后得到的是最上面一行的最右一个象素。

2 编程 代码如下: #include #include using std::cout; using std::endl; unsigned char * pData; int width; int height; int bitCount; RGBQUAD * pRGBQUAD; bool readBmpFile(char * filename) { FILE * pf; pf = fopen(filename, "rb"); if (NULL == pf) { cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有