bmp图像的读取_第1页
bmp图像的读取_第2页
bmp图像的读取_第3页
bmp图像的读取_第4页
bmp图像的读取_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、BMP图像文件由三部分组成:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />位图文件主要分为如下3个部分:块名称对应Windows结构体定义大小(Byte)文件信息头BITMAPFILEHEADER14位图信息头BITMAPINFOHEADER40RGB颜色阵列BYTE*由图像长宽尺寸决定1、  

2、60;文件信息头BITMAPFILEHEADER结构体定义如下:typedef struct tagBITMAPFILEHEADER WORD bfType;  DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER;其中: bfType 说明文件的类型,该值必需是0x4D42,也就是字符'BM'。bfSize说明该位图文件的大小,用字节为单位,即整个图像文件的存储需要多少存储空间。bfReserved1保留,必须设置

3、为0bfReserved2保留,必须设置为0bfOffBits说明从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。 2、位图信息头BITMAPINFOHEADER结构体定义如下:typedef struct tagBITMAPINFOHEADER DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCo

4、mpression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; BITMAPINFOHEADER;其中:biSize说明BITMAPINFOHEADER结构所需要的字数。一般是40biWidth说明图象的宽度,以象素为单位。 biHeight说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正

5、数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是说高度值是一个正数。biPlanes为目标设备说明位面数,其值将总是被设为1。biBitCount说明比特数/象素,其值为1、4、8、16、24、或32。但是由于我们平时用到的图像绝大部分是24位和32位的,所以我们讨论这两类图像。 24表示一个像素占三个字节。biCompression说明图象数据压缩的类型,同样我们只讨论没有压缩的类型:BI_RGB。biSizeImage说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0。biSizeImage = biWidth * biH

6、eight (但是此处的biWidth必须是4的倍数,比如biWidth =240,则可仍然是240,但是若biWidth = 241 ,则取biWidth = 244.)biXPelsPerMeter说明水平分辨率,用象素/米表示。biYPelsPerMeter说明垂直分辨率,用象素/米表示。biClrUsed说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。biClrImportant说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。 sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER) + biS

7、izeImage = bfSize比如一幅图像的占用的存储空间是1729590. 则它的组成是:BITMAPINFOHEADER结构所需要的字数 40 ;BITMAPFILEHEADER这个结构所占的字节数14;真正的图像大小1729536.所以 40 + 14 + 1729536 = 1729590BMP头文件格式以及C语言读取头文件(二)具体数据举例:如某BMP文件开头:424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F 0

8、000 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

9、-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色,增强型真彩色)。

10、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:用象素/米

11、表示的水平分辨率。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

12、 short int  bfType;       /位图文件的类型,必须为BM unsigned long       bfSize;       /文件大小,以字节为单位unsigned short int  bfReserverd1; /位图文件保留字,必须为0 unsigned short int  bfReserverd2; /位图文件保留字,必须为0 unsigned lon

13、g       bfbfOffBits;  /位图文件头到数据的偏移量,以字节为单位BITMAPFILEHEADER; typedef  struct  tagBITMAPINFOHEADER long biSize;                        /该结构大小,

14、字节为单位long  biWidth;                     /图形宽度以象素为单位long  biHeight;                     /图形

15、高度以象素为单位short int  biPlanes;               /目标设备的级别,必须为1 short int  biBitcount;             /颜色深度,每个象素所需要的位数short int  biCompression;   

16、0;    /位图的压缩类型long  biSizeImage;              /位图的大小,以字节为单位long  biXPelsPermeter;       /位图水平分辨率,每米像素数long  biYPelsPermeter;       /位图垂直分辨率,每米像素数

17、long  biClrUsed;            /位图实际使用的颜色表中的颜色数long  biClrImportant;       /位图显示过程中重要的颜色数BITMAPINFOHEADER; typedef  struct BITMAPFILEHEADER  file; /文件信息区BITMAPINFOHEADER  info; /图象信息区bmp;bmp

18、60; readbmpfile(void); /函数声明int main(void)   bmp m;          /定义一个结构变量  m=readbmpfile(); /读取一个位图  getchar();  return 0;   bmp  readbmpfile(void) bmp  m;        /定义一个位图结构  FILE

19、 *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(&

20、quot;%cn",m.file.bfType);        fread(&m.file.bfSize,sizeof(long),1,fp); printf("文件长度为%dn",m.file.bfSize);  fread(&m.file.bfReserverd1,sizeof(short int),1,fp); printf("保留字1为%dn",m.file.bfReserverd1); fread(&m.file.bfReserv

21、erd2,sizeof(short int),1,fp); printf("保留字2为%dn",m.file.bfReserverd2); fread(&m.file.bfbfOffBits,sizeof(long),1,fp); printf("偏移量为%dn",m.file.bfbfOffBits);fread(&.biSize,sizeof(long),1,fp); printf("此结构大小为%dn",.biSize); fread(&.biWidth,sizeof(

22、long),1,fp); printf("位图的宽度为%dn",.biWidth);fread(&.biHeight,sizeof(long),1,fp); printf("位图的高度为%dn",.biHeight);fread(&.biPlanes,sizeof(short),1,fp); printf("目标设备位图数%dn",.biPlanes);fread(&.biBitcount,sizeof(short),1,fp); prin

23、tf("颜色深度为%dn",.biBitcount);fread(&.biCompression,sizeof(long),1,fp); printf("位图压缩类型%dn",.biCompression); fread(&.biSizeImage,sizeof(long),1,fp); printf("位图大小%dn",.biSizeImage); fread(&.biXPelsPermeter,sizeof(long),1,fp); p

24、rintf("位图水平分辨率为%dn",.biXPelsPermeter); fread(&.biYPelsPermeter,sizeof(long),1,fp); printf("位图垂直分辨率为%dn",.biYPelsPermeter); fread(&.biClrUsed,sizeof(long),1,fp); printf("位图实际使用颜色数%dn",.biClrUsed);fread(&.biClrImportant,size

25、of(long),1,fp); printf("位图显示中比较重要颜色数%dn",.biClrImportant); return m; 结果执行如下:1BMP文件的读入BMP文件分为4个组成部分,那么BMP文件的读入也要按照4个组成部分依次进行处理,即先处理BITMAPFILEHEADER结构,然后是BITMAPINFOHEADER结构、颜色表,最后是位图数据。首先,有关BITMAPFILEHEADER、BITMAPINFOHEADER、RGBQUAD等结构的定义包含在头文件“Windows.h”中,应把其包含进来。#include "Windows

26、.h"其次,为了后面对图像进行修改及存盘方便,我们定义了几个全局变量,用来存放读入图像的位图数据、宽、高、颜色表及每像素位数等信息。所定义的全局变量如下:unsigned char *pBmpBuf;/读入图像数据的指针int bmpWidth;/图像的宽int bmpHeight;/图像的高RGBQUAD *pColorTable;/颜色表指针int biBitCount;/图像类型,每像素位数根据BMP文件结构,BMP文件读入操作的基本流程如图1-8所示。  图1-8 BMP文件读入操作流程图readBmp()函数实现了BMP文件的读取操作,下面的代码是对re

27、adBmp()函数的说明和实现。/* 函数名称:*     readBmp()*函数参数:*    char *bmpName -文件名字及路径*返回值:*    0为失败,1为成功*说明:给定一个图像文件名及其路径,读图像的位图数据、宽、高、颜色表及每像素*      位数等数据进内存,存放在相应的全局变量中*/bool readBmp(char *bmpName)/二进制读方式打开指定的图像文件FILE *fp=fopen(bmpName,&

28、quot;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

29、;/定义变量,计算图像每行像素所占的字节数(必须是4的倍数)int lineByte=(bmpWidth * biBitCount/8+3)/4*4;/灰度图像有颜色表,且颜色表表项为256if(biBitCount=8)/申请颜色表所需要的空间,读颜色表进内存pColorTable=new RGBQUAD256;fread(pColorTable,sizeof(RGBQUAD),256,fp);/申请位图数据所需要的空间,读位图数据进内存pBmpBuf=new unsigned charlineByte * bmpHeight;fread(pBmpBuf,1,lineByte * bmpHe

30、ight,fp);/关闭文件fclose(fp);return 1;2BMP文件的存盘给定图像路径名以及图像的数据,对图像的写操作也是按照BMP文件4个组成部分进行分别处理的。其基本流程如图1-9所示。   图1-9 BMP文件写操作流程图saveBmp()函数实现了BMP文件的写操作,该函数的说明及代码实现如下。/* 函数名称:*     saveBmp()*函数参数:*    char *bmpName-文件名字及路径*    unsigned char *im

31、gBuf-待存盘的位图数据*    int width-以像素为单位待存盘位图的宽*    int height-以像素为单位待存盘位图高*    int biBitCount-每像素所占位数*    RGBQUAD *pColorTable-颜色表指针*返回值:*    0为失败,1为成功*说明:给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,*      将其写到指定文件中*

32、/bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, int biBitCount, RGBQUAD *pColorTable)/如果位图数据指针为0,则没有数据传入,函数返回if(!imgBuf)return 0;/颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0int colorTablesize=0;if(biBitCount=8)colorTablesize=1024;/待存储图像数据每行字节数为4的倍数int lineByte=(width * biBitCo

33、unt/8+3)/4*4;/以二进制写的方式打开文件FILE *fp=fopen(bmpName,"wb");if(fp=0) return 0;/申请位图文件头结构变量,填写文件头信息BITMAPFILEHEADER fileHead;fileHead.bfType = 0x4D42;/bmp类型/bfSize是图像文件4个组成部分之和fileHead.bfSize= sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER)+ colorTablesize + lineByte*height;fileHead.bfReserved1 = 0;fileHead.bfReserved2 = 0;/bfOffBits是图像文件前3个部分所需空间之和fileHead.bfOffBits=54+colorTablesize;/写文件头进文件fwrite(&fileHead, sizeof(BITMAPFILEHE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论