当前位置:文档之家› bmp图像的读取

bmp图像的读取

BMP图像文件由三部分组成:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。

<?xml:namespace prefix = o ns ="urn:schemas-microsoft-com:office:office" />位图文件主要分为如下3个部分:1、文件信息头BITMAPFILEHEADER结构体定义如下:typedef struct tagBITMAPFILEHEADER {WORD bfType;DWORD bfSize;WORD bfReserved1;WORD bfReserved2;DWORD bfOffBits;} BITMAPFILEHEADER;其中:2、位图信息头BITMAPINFOHEADER结构体定义如下:typedef struct tagBITMAPINFOHEADER {DWORD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;} BITMAPINFOHEADER;其中:BMP头文件格式以及C语言读取头文件(二)具体数据举例:如某BMP文件开头:424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 .... ....BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用*分隔。

一、图像文件头1)1:(这里的数字代表的是"字",即两个字节,下同)图像文件头。

424Dh=’BM’,表示是Windows支持的BMP格式。

2)2-3:整个文件大小。

4690 0000,为00009046h=36934。

3)4-5:保留,必须设置为0。

4)6-7:从文件开始到位图数据之间的偏移量。

4600 0000,为00000046h=70,上面的文件头就是35字=70字节。

5)8-9:位图图信息头长度。

6)10-11:位图宽度,以像素为单位。

8000 0000,为00000080h=128。

7)12-13:位图高度,以像素为单位。

9000 0000,为00000090h=144。

8)14:位图的位面数,该值总是1。

0100,为0001h=1。

二、位图信息头9)15:每个像素的位数。

有1(单色),4(16色),8(256色),16(64K 色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。

1000为0010h=16。

10)16-17:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。

RLE简单地说是采用像素数+像素值的方式进行压缩。

T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。

图中0300 0000为00000003h=3。

11)18-19:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于位图宽度×位图高度×每个像素位数。

0090 0000为00009000h=80×90×2h=36864。

12)20-21:用象素/米表示的水平分辨率。

A00F 0000为0000 0FA0h=4000。

13)22-23:用象素/米表示的垂直分辨率。

A00F 0000为0000 0FA0h=4000。

14)24-25:位图使用的颜色索引数。

设为0的话,则说明使用所有调色板项。

15)26-27:对图象显示有重要影响的颜色索引的数目。

如果是0,表示都重要。

具体代码C语言执行:(D 盘中有文件名为1的bmp图像)#include <stdio.h>#include <stdlib.h>typedef struct tagBITMAPFILEHEADER{unsigned short int bfType; //位图文件的类型,必须为BM unsigned long bfSize; //文件大小,以字节为单位unsigned short int bfReserverd1; //位图文件保留字,必须为0 unsigned short int bfReserverd2; //位图文件保留字,必须为0 unsigned long bfbfOffBits; //位图文件头到数据的偏移量,以字节为单位}BITMAPFILEHEADER;typedef struct tagBITMAPINFOHEADER{long biSize; //该结构大小,字节为单位long biWidth; //图形宽度以象素为单位long biHeight; //图形高度以象素为单位short int biPlanes; //目标设备的级别,必须为1short int biBitcount; //颜色深度,每个象素所需要的位数short int biCompression; //位图的压缩类型long biSizeImage; //位图的大小,以字节为单位long biXPelsPermeter; //位图水平分辨率,每米像素数long biYPelsPermeter; //位图垂直分辨率,每米像素数long biClrUsed; //位图实际使用的颜色表中的颜色数long biClrImportant; //位图显示过程中重要的颜色数}BITMAPINFOHEADER;typedef struct{BITMAPFILEHEADER file; //文件信息区BITMAPINFOHEADER info; //图象信息区}bmp;bmp readbmpfile(void); //函数声明int main(void){bmp m; //定义一个结构变量m=readbmpfile(); //读取一个位图getchar();return 0;}bmp readbmpfile(void){ bmp m; //定义一个位图结构FILE *fp;if((fp=fopen( "d:\\1.bmp", "r"))==NULL){ printf( "can't open the bmp imgae.\n ");exit(0);}else{fread(&m.file.bfType,sizeof(char),1,fp);printf("类型为%c",m.file.bfType);fread(&m.file.bfType,sizeof(char),1,fp);printf("%c\n",m.file.bfType);fread(&m.file.bfSize,sizeof(long),1,fp);printf("文件长度为%d\n",m.file.bfSize);fread(&m.file.bfReserverd1,sizeof(short int),1,fp); printf("保留字1为%d\n",m.file.bfReserverd1);fread(&m.file.bfReserverd2,sizeof(short int),1,fp); printf("保留字2为%d\n",m.file.bfReserverd2);fread(&m.file.bfbfOffBits,sizeof(long),1,fp);printf("偏移量为%d\n",m.file.bfbfOffBits);fread(&.biSize,sizeof(long),1,fp);printf("此结构大小为%d\n",.biSize);fread(&.biWidth,sizeof(long),1,fp);printf("位图的宽度为%d\n",.biWidth);fread(&.biHeight,sizeof(long),1,fp);printf("位图的高度为%d\n",.biHeight);fread(&.biPlanes,sizeof(short),1,fp);printf("目标设备位图数%d\n",.biPlanes);fread(&.biBitcount,sizeof(short),1,fp);printf("颜色深度为%d\n",.biBitcount);fread(&.biCompression,sizeof(long),1,fp); printf("位图压缩类型%d\n",.biCompression); fread(&.biSizeImage,sizeof(long),1,fp);printf("位图大小%d\n",.biSizeImage);fread(&.biXPelsPermeter,sizeof(long),1,fp);printf("位图水平分辨率为%d\n",.biXPelsPermeter);fread(&.biYPelsPermeter,sizeof(long),1,fp);printf("位图垂直分辨率为%d\n",.biYPelsPermeter);fread(&.biClrUsed,sizeof(long),1,fp);printf("位图实际使用颜色数%d\n",.biClrUsed);fread(&.biClrImportant,sizeof(long),1,fp);printf("位图显示中比较重要颜色数%d\n",.biClrImportant); }return m;}结果执行如下:的位图数据、宽、高、颜色表及每像素* 位数等数据进内存,存放在相应的全局变量中***********************************************************************/bool readBmp(char *bmpName){//二进制读方式打开指定的图像文件FILE *fp=fopen(bmpName,"rb");if(fp==0) return 0;//跳过位图文件头结构BITMAPFILEHEADERfseek(fp, sizeof(BITMAPFILEHEADER),0);//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中BITMAPINFOHEADER head;fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);//获取图像宽、高、每像素所占位数等信息bmpWidth = head.biWidth;bmpHeight = head.biHeight;biBitCount = head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表表项为256if(biBitCount==8){//申请颜色表所需要的空间,读颜色表进内存pColorTable=new RGBQUAD[256];fread(pColorTable,sizeof(RGBQUAD),256,fp);}//申请位图数据所需要的空间,读位图数据进内存pBmpBuf=new unsigned char[lineByte * bmpHeight];fread(pBmpBuf,1,lineByte * bmpHeight,fp);//关闭文件fclose(fp);return 1;}2.BMP文件的存盘给定图像路径名以及图像的数据,对图像的写操作也是按照BMP文件4个组成部分进行分别处理的。

相关主题