vc中_bmp文件结构及存取1

合集下载

用c语言读取并显示bmp图像1

用c语言读取并显示bmp图像1

如何在WIN-TC中或TC++3.0中把一张BMP格式的图片显示出来?下面的是<<C & C++编程实例>>随书光盘上的代码,我在TC2.0下编译通过.它是利用了抖动技术显示了8bit和24bit的位图(也就是256色和16M色位图),应该能满足你的需要.不过,我想问下,你老师教过抖动显示吗?#include <stdio.h>#include <dos.h>#include <stdio.h>#include <conio.h>#define NoError 0#define ErrorFileOpen 1#define ErrorFileType 2#define ErrorImageColor 3typedef struct tagBITMAPFILEHEADER{unsigned int bfType;unsigned long bfSize;unsigned int bfReserved1;unsigned int bfReserved2;unsigned long bfoffBits;}BITMAPFILEHEADER;typedef struct tagBITMAPINFOHEADER{unsigned long biSize;unsigned long biWidth;unsigned long biHeight;unsigned int biPlanes;unsigned int biBitCount;unsigned long biCompression;unsigned long biSizeImage;unsigned long biXPelsPerMeter;unsigned long biYPelsPerMeter;unsigned long biClrUsed;unsigned long biClrImportant;} BITMAPINFOHEADER;typedef struct tagRGBQUAD{unsigned char rgbBlue;unsigned char rgbGreen;unsigned char rgbRed;unsigned char rgbReserved;} RGBQUAD;unsigned char PalReg[17]= { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0}; unsigned char StandardPal[48]= {0, 0, 0, 32, 0, 0, 0,32, 0, 32,32, 0, 0, 0,32, 32, 0,32, 0,32,32, 32,32, 32, 48, 48,48, 63, 0, 0, 0,63, 0, 63,63, 0, 0, 0,63, 63, 0,63, 0,63,63, 63,63,63, };unsigned char LightnessMatrix [16][16]= {{ 0,235,59,219,15,231,55,215,2,232,56,217,12,229,52,213},{128,64,187,123,143,79,183,119,130,66,184,120,140,76,180,116},{33,192,16,251,47,207,31,247,34,194,18,248,44,204,28,244},{161,97,144,80,175,111,159,95,162,98,146,82,172,108,156,92},{8,225,48,208,5,239,63,223,10,226,50,210,6,236,60,220},{136,72,176,112,133,69,191,127,138,74,178,114,134,70,188,124},{41,200,24,240,36,197,20,255,42,202,26,242,38,198,22,252},{169,105,152,88,164,100,148,84,170,106,154,90,166,102,150,86},{3,233,57,216,13,228,53,212,1,234,58,218,14,230,54,214},{131,67,185,121,141,77,181,117,129,65,186,122,142,78,182,118},{35,195,19,249,45,205,29,245,32,193,17,250,46,206,30,246},{163,99,147,83,173,109,157,93,160,96,145,81,174,110,158,94},{11,227,51,211,7,237,61,221,9,224,49,209,4,238,62,222},{139,75,179,115,135,71,189,125,137,73,177,113,132,68,190,126},{43,203,27,243,39,199,23,253,40,201,25,241,37,196,21,254},{171,107,155,91,167,103,151,87,168,104,153,89,165,101,149,85},};unsigned char ColorTable[2][2][2]= {{{0,12},{10,14}},{{9,13},{11,15}}}; unsigned char ColorMap[256][3];int ShowBmp(char *FileName);int GetColor(unsigned char R,unsigned char G, unsigned char B,int X,int Y); void SetVideoMode(unsigned char Mode);void SetPalReg(unsigned char *palReg);void SetDacReg(unsigned char *DacReg, int Color, int Count);void PutPixel(int X, int Y, unsigned char Color);/* 主函数*/void main (int argc, char *argv[]){if(argc!=2){printf("Usage:\tSHOW Filename.BMP\n");exit(1);}ShowBmp(argv[1]);}/* 根据图像文件名,读取图像内容并利用抖动技术进行显示*/ int ShowBmp(char *FileName){FILE *Fp;BITMAPFILEHEADER FileHead;BITMAPINFOHEADER InfoHead;RGBQUAD RGB;int N, W,Y,X,C,Color;unsigned char Buffer[4096];Fp=fopen(FileName,"rb");if (Fp==NULL)return(ErrorFileOpen);fread(&FileHead,sizeof(BITMAPFILEHEADER),1,Fp);if(FileHead.bfType!='BM'){fclose(Fp);return(ErrorFileType);}fread(&InfoHead,sizeof(BITMAPINFOHEADER),1,Fp);if(InfoHead.biBitCount!=8 && InfoHead.biBitCount!=24){fclose(Fp);return(ErrorImageColor);}/* 设置显示模式和显示区域*/SetVideoMode(0x12);SetPalReg(PalReg);SetDacReg(StandardPal,0,16);/* 对两种不同色彩数的图像分别进行处理*/if(InfoHead.biBitCount==8) /* 256色*/{for (N=0;N<256;N++){fread(&RGB, sizeof(RGBQUAD),1,Fp);ColorMap[N][0]=RGB.rgbRed;ColorMap[N][1]=RGB.rgbGreen;ColorMap[N][2]=RGB.rgbBlue;}W=(InfoHead.biWidth+3)/4*4;for(Y=InfoHead.biHeight-1;Y>=480;Y--)fread(Buffer,sizeof(unsigned char),W,Fp);for(;Y>0;Y--){fread(Buffer,sizeof(unsigned char),W,Fp);for (X=0;X<InfoHead.biWidth && X<640;X++){C=Buffer[X];Color=GetColor(ColorMap[C][0],ColorMap[C][1],ColorMap[C][2],X,Y); PutPixel (X,Y,Color);}}}else /* 24bits真彩色*/{W=(InfoHead.biWidth*3+3)/4*4;for(Y=InfoHead.biHeight-1;Y>639;Y--)fread(Buffer,sizeof(unsigned char),W,Fp);for(;Y>=0;Y--){fread(Buffer,sizeof(unsigned char),W,Fp);for(X=0;X<InfoHead.biWidth && X<640;X++){C=X*3;Color=GetColor(Buffer[C+2],Buffer[C+1],Buffer[C],X,Y);PutPixel(X,Y,Color);}}}getch();fclose(Fp);SetVideoMode(0x03);return(NoError);}int GetColor(unsigned char R, unsigned char G, unsigned char B, int X, int Y) {unsigned int L=LightnessMatrix[Y & 0x0F][X & 0x0F];return(ColorTable[(unsigned int)R*256/255>L][(unsigned int)G*256/255>L][(unsigned int)B*256/255>L]); }void SetVideoMode(unsigned char Mode){_AH=0x00;_AL=Mode;geninterrupt(0x10);}void SetPalReg(unsigned char *PalReg){_ES=FP_SEG((unsigned char far*)PalReg);_DX=FP_OFF((unsigned char far*)PalReg);_AX=0x1002;geninterrupt(0x10);}void SetDacReg(unsigned char *DacReg,int Color,int Count){_ES=FP_SEG((unsigned char far*)DacReg);_DX=FP_OFF((unsigned char far*)DacReg);_AX=0x1012;_BX=Color;_CX=Count;geninterrupt(0x10);}/* 在对应位置显示像素色彩*/void PutPixel(int X, int Y, unsigned char Color){_AH=0x0C;_AL=Color;_CX=X;_DX=Y;geninterrupt(0x10);}16色位图的显示文:吴进/Luckylai对于象大家常用TC的16色图形模式编程的初学者,如果能在程序里使用图片那就会方便很多了,以前在TC256上看见吴进写的《TC的16色BMP闪电显示(66k) 》的代码,发现写的的确不错,而且绝对能在TC的initgraph()初始化的BGI模式下使用。

图像文件格式BMP文件格式详解

图像文件格式BMP文件格式详解

5.2 BMP文件格式BMP文件格式是Microsoft Windows下最常见的图像文件格式之一,它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。

BMP文件的图像深度可选lbit、4bit、8bit及24bit。

BMP文件存储数据时,图像的像素值在文件中的存放顺序为从左到右,从下到上,也就是说,在BMP文件中首先存放的是图像的最后一行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右边的的顺序存储的;另外一个需要关注的细节是:文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储,否则,需要在后端补0,凑足4的倍数。

由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows 环境中运行的图形图像软件都支持BMP图像格式。

5.2.1典型的BMP图像文件由四部分组成:1、位图头文件数据结构主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;2、位图信息数据结构包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用的颜色数等信息;3、调色板包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。

4、位图数据记录了位图的每一个像素值或该对应像素的颜色表的索引值,图像记录顺序是在扫描行内是从左到右, 扫描行之间是从下到上。

这种格式我们又称为Bottom_Up位图,当然与之相对的还有Up_Down形式的位图,它的记录顺序是从上到下的,对于这种形式的位图,也不存在压缩形式。

5.2.2 BMP文件结构位图文件(bitmap file, BMP)格式是Windows采用的图像文件存储格式,在Windows 环境下运行的所有图像处理软件都支持这种格式。

bmp文件格式详解

bmp文件格式详解

BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。

由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。

Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持。

下面以Notepad++为分析工具,结合Windows的位图数据结构对BMP文件格式进行一个深度的剖析。

BMP文件的数据按照从文件头开始的先后顺序分为四个部分:bmp文件头(bmp file header):提供文件的格式、大小等信息位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表位图数据(bitmap data):就是图像数据啦^_^下面结合Windows结构体的定义,通过一个表来分析这四个部分。

我们一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是所位图信息头后面紧跟的就是位图数据了。

因此,我们常常见到有这样一种说法:位图文件从文件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。

这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。

下面针对一幅特定的图像进行分析,来看看在位图文件中这四个数据段的排布以及组成。

我们使用的图像显示如下:这是一幅16位的位图文件,因此它是含有调色板的。

在拉出图像数据进行分析之前,我们首先进行几个约定:1. 在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址村存放低位数据,高地址存放高位数据”。

Bmp图像存储格式

Bmp图像存储格式

摘要:本文简单介绍了位图文件的两种存储格式,并且在VC++6.0下实现了读取位图文件中的数据,用SetPixel()函数在窗口中重现图像,最后在程序中实现了一种存储格式到另一种存储格式的转换。

关键字:BMP、灰度位图、24位真彩色位图、存储格式一、前言BMP(Bitmap的缩写)图像是指文件名后缀为BMP的位图图像。

位图图像在计算机中使用很广泛,例如在windows中,记事本、写字板中的文字就是用位图图像表示出来的。

许多以其它格式存储的图像,就是在位图图像的基础上,进行优化处理后得到的,例如JPEG图像等。

在数字图像处理中,许多算法就是针对24位真彩色位图或灰度位图设计的。

因此,很有必要介绍一下位图文件的这两种存储格式。

二、24位真彩色图像存储格式把下图的24位真彩色图像格式在16位编辑器(例如VC编辑器)中打开,可以看到图像的二进制数据。

24位真彩色的二进制数据为:这是24位真彩色位图文件数据一部分。

这一部分数据包括位图文件头、位图信息头和位图阵列三部分。

(一)位图文件头位图文件头用来记录标志文件大小的一些信息,在文件中占14个字节,存储的内容如下:字节 1 2 3 4 5 6 7 8 9 10 11 12 13 14 000000 42 4D CC B4 02 00 00 00 00 00 36 00 00 00 其中:42 4D 为位图的标志,即ASCII码为BMCC B4 02 表示位图文件的总字节数,换算成十进制为(02B4CC)H=(177356)10,即这副图像的大小为177356字节。

00 00 00 00 00 为保留字节,用来存储文件大小的数据。

36 00 00 00 00 表示位图阵列的起始位置,(36)H=(54)10即54字节开始为位图阵列。

(二) 位图信息头位图信息头记录和位图相关的一些信息,在文件中占40个字节,存储的内容如下:字节 1 2 3 4 5 6 7 8 9 10 11121314151600000 0 2800001 6 02C1C511800003 2 012B12B00004 8 0其中:28 00 00 00 表示信息头的长度,(28)H=(40)10,即位图信息头占40个字节。

在VC中加载bmp图片的问题

在VC中加载bmp图片的问题

在VC中加载bmp图片的问题问题:当我 insert-->resource-->选中 -->Bitmap-->import加载图片时出现下面的错误:The bitmap has been imported correctly,howerver beacuse it containsmorethan 256 colors it cannot be loaded in the bitmap editor这是什么错误啊、要怎么改正呢?答:没有错误,你加载的图片高于256色,VC没有提供对高于256色图片的编辑器,所以在VC中不能编辑,只能使用。

而编辑就是对它的修改了,在VC中不能对高于256色的图片进行修改。

但是可以随便用一个图片编辑软件就可以得到低于256色图,比如WINDOWS画图,photoshop等。

打开一个图片,然后另存为,其中有一项选择,256色。

保存就OK了此外对于jpg图片,都可以用windows画图、photoshop来保存成256色的bmp图片,然后在VC中使用。

相关函数为LoadBitmap,具体使用可参见MSDN。

下文可做一定参考。

数字图像处理- MFC教程第一课建立MFC和打开bmp图片第一步:建立MFC工程文件--新建--MFC AppWizardd(exe)工程--单文档—确定。

第二步:设置打开函数查看--建立类导向(Ctrl+W)--CpictureXSView(类名)--ID_FILE_OPEN(IDs列表)--COMMAND(Messages列表)--默认成员函数名为OnFileOpen--Member Functions(成员函数)中双击该函数进入函数编辑。

建立如下函数:打开图片、保存图片为重点。

对象标识符消息函数名所属类ID_FILE_OPENCOMMANDOnFileOpenCpainterViewID_FILE_SAVECOMMANDOnFileSaveCpainterViewID_FILE_NEWUPDATE_COMMAND_UIOnUpdateFileNewCpainterViewID_FILE_MRU_FILE1UPDATE_COMMAND_UIOnUpdateFileMruFile1CpainterView注意:在添加Messages列表中:ON_COMMAND是点了按钮或菜单项后的响应消息;ON_UPDATE_COMMAND_UI是用来表示对应的按钮和菜单项的状态的响应消息,比如你打开这个菜单时,处理这个菜单的状态,比如选中、变灰等。

BMP图像存储格式

BMP图像存储格式

维基百科的BMP定义BMP取自位图BitMaP的缩写,也称为DIB(与设备无关的位图),是微软视窗图形子系统(Graphics Device Interface)内部使用的一种位图图形格式,它是微软视窗平台上的一个简单的图形文件格式。

图像通常保存的颜色深度有2(1位)、16(4位)、256(8位)、65536(16位)和1670万(24位)种颜色(其中位是表示每点所用的数据位)。

8位图像可以是索引彩色图像外,也可以是灰阶图像。

表示透明的alpha通道也可以保存在一个类似于灰阶图像的独立文件中。

带有集成的alpha通道的32位版本已经随着Windows XP出现,它在视窗的登录和主题系统中都有使用。

文件大小计算BMP文件通常是不压缩的,所需存储空间比较大。

一个像素所占的字节数为n∕8字节,n是位深。

文件大小可以根据以下公式近似计算:BMP文件大小≈54+4*2n+(width*height*n)∕8;54是位图文件的文件头,4*2n是调色板的大小(对于没有调色板的位图文件,则不存在这一项),最后一项是像素数据。

由于存储算法决定的因素,实际文件大小和计算值可能有细微差别;因此使用的≈符号而不是等于号。

文件存储格式BMP图像自推出以后,几经演进,存储格式也有所变化。

下表详细描述了位图文件可能包含的数据。

结构体名称可选大小用途备注位图文件头否14字节存储位图文件通用信息仅在读取文件时有用DIB头否固定(存在7种不同版本)存储位图详细信息及像素格式紧接在位图文件头后附加位掩码是3或4 DWORD(12或16字节)定义像素格式仅在DIB头是BITMAPINFOHEADER时存在调色板见备注可变定义图像数据(像素数组)所用颜色色深≤ 8时不能省略填充区A是可变结构体对齐位图文件头中像素数组偏移量的产物像素数组否可变定义实际的像素数值像素数据在DIB头和附加位掩码中定义。

像素数组中每行均以4字节对齐填充区B 是可变结构体对齐DIB头中ICC色彩特性数据偏移量的产物ICC色彩特性数据是可变定义色彩特性可以包含外部文件路径,由该文件来定义色彩特性Remark:像素数组每行均以4字节对齐,这会影响我们怎么读取像素数据。

如何在vc++中旋转位图

如何在vc++中旋转位图

如何在vc++中旋转位图第一步,你必须知道位图即BMP格式的文件的结构.位图(bmp)文件由以下几个部分组成:1.BITMAPFILEHEADER,它的定义如下:typedef struct tagBITMAPFILEHEADER{WORD bfType; //必须为'BM'DWORD bfSize; //文件大小WORD bfReserved1; //必须为0WORD bfReserved2; //必须为0DWORD bfOffBits; //从ITMAPFILEHEADER到存放bmp数据的偏移量} BITMAPFILEHEADER, *PBITMAPFILEHEADER;2.BITMAPINFOHEADER,它的定义如下:typedef struct tagBITMAPINFOHEADER{DWORD biSize; //此结构的大小,可用sizeof(BITMAPINFOHEAER)得到LONG biWidth; //位图宽度,以象素为单位LONG biHeight; //位图高度,以象素为单位WORD biPlanes; //必须为1WORD biBitCount;//位图象素位数,可为0,1,4,8,24,32DWORD biCompression;DWORD biSizeImage; //(仅用于压缩)LONG biXPelsPerMeter; //一米横向象素数LONG biYPelsPerMeter; //一米纵向象素数DWORD biClrUsed;// (非零用语短颜色表)DWORD biClrImportant;} BITMAPINFOHEADER, *PBITMAPINFOHEADER;由于以上信息可以直接从MSDN上查到,所以只做简单介绍,你可以自己查看NSDN帮助,上面有很详细的介绍.3.DIB位图像.这里放的是真正的位图数据.知道了位图的存放格式,下面我们就可以很容易的把它读如内存.第二步,读入bmp图像LPCTSTR lpszFileName4="untitled.bmp"; //文件路径CFile file; //用于读取BMP文件BITMAPFILEHEADER bfhHeader;//bmp文件头BITMAPINFOHEADER bmiHeader; //bmp格式头LPBITMAPINFO lpBitmapInfo; //bmp格式具体信息int bmpWidth=0; //图片宽度int bmpHeight = 0; //图片高度if(!file.Open(lpszFileName,CFile::modeRead))return ; //打开文件file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));//读取文件头if(bfhHeader.bfType!=((WORD) ('M'<return ;if(bfhHeader.bfSize!=file.GetLength())return ;if (file.Read((LPSTR)&bmiHeader, sizeof(bmiHeader)) != sizeof(bmiHeader)) return ;bmpHeight = bmiHeader.biHeight;//得到高度和宽度bmpWidth = bmiHeader.biWidth;file.SeekToBegin();file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));UINT uBmpInfoLen=(UINT) bfhHeader.bfOffBits-sizeof(BITMAPFILEHEADER);lpBitmapInfo=(LPBITMAPINFO) new BYTE[uBmpInfoLen];file.Read((LPVOID) lpBitmapInfo,uBmpInfoLen);if((* (LPDWORD)(lpBitmapInfo))!=sizeof(BITMAPINFOHEADER))return ;DWORD dwBitlen=bfhHeader.bfSize - bfhHeader.bfOffBits;LPVOID lpSrcBits=new BYTE[dwBitlen]; //将数据读入lpSrcBits数组file.ReadHuge(lpSrcBits,dwBitlen);file.Close(); //关闭文件。

位图文件(BMP)格式分析以及程序实现

位图文件(BMP)格式分析以及程序实现

inf.read((char*)&header, sizeof(header));if(header.bfType != 0x4D42)return false;这个很简单,没有什么好说的。

2、加载位图信息头//Load the image information headerBITMAPINFOHEADER infoheader;memset(&infoheader, 0, sizeof(infoheader));inf.read((char*)&infoheader, sizeof(infoheader));m_iImageWidth = infoheader.biWidth;m_iImageHeight = infoheader.biHeight;m_iBitsPerPixel = infoheader.biBitCount;这里我们得到了3各重要的图形属性:宽,高,以及每个像素颜色所占用的位数。

3、行对齐由于Windows在进行行扫描的时候最小的单位为4个字节,所以当图片宽X 每个像素的字节数!= 4的整数倍时要在每行的后面补上缺少的字节,以0填充(一般来说当图像宽度为2的幂时不需要对齐)。

位图文件里的数据在写入的时候已经进行了行对齐,也就是说加载的时候不需要再做行对齐。

但是这样一来图片数据的长度就不是:宽X 高X 每个像素的字节数了,我们需要通过下面的方法计算正确的数据长度://Calculate the image data sizeint iLineByteCnt = (((m_iImageWidth*m_iBitsPerPixel) + 31) >> 5) << 2;m_iImageDataSize = iLineByteCnt * m_iImageHeight;4、加载图片数据对于24位和32位的位图文件,位图数据的偏移量为sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER),也就是说现在我们可以直接读取图像数据了。

BMP文件结构读写操作(图文) c实现

BMP文件结构读写操作(图文) c实现

BITMAPFILEHEADER结构的各个域详细说明如下:bfType:位图文件类型,必须是0x424D,即字符串“BM”,也就是说,所有的“*.bmp”文件的头两个字节都是“BM”。

bfSize:位图文件大小,包括这14个字节。

bfReserved1, bfReserved2:Windows保留字,暂不用。

bfOffBits:从文件头到实际的位图数据的偏移字节数,图1-7中前3个部分的长度之和。

图1-7 BMP文件结构示意图第2部分为位图信息头BITMAPINFOHEADER,也是一个结构体类型的数据结构,该结构的长度也是固定的,为40个字节(WORD为无符号16位整数,DWORD为无符号32位整数,LONG为32位整数)。

其定义如下:typedef struct tagBITMAPINFOHEADER{DWORD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCountDWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;RGBQUAD结构的各个域的详细说明如下:rgbBlue:该颜色的蓝色分量;rgbGreen:该颜色的绿色分量;rgbRed:该颜色的红色分量;rgbReserved:保留字节,暂不用。

有些位图需要颜色表;有些位图(如真彩色图)则不需要颜色表,颜色表的长度由BITMAPINFOHEADER结构中biBitCount分量决定。

对于biBitCount值为1的二值图像,每像素占1bit,图像中只有两种(如黑白)颜色,颜色表也就有21=2个表项,整个颜色表的大小为个字节;对于biBitCount值为8的灰度图像,每像素占8bit,图像中有颜色,颜色表也就有256个表项,且每个表项的R、G、B分量相等,整个颜色表的大小为个字节;而对于biBitCount=24的真彩色图像,由于每像素3个字节中分别代表了R、G、B三分量的值,此时不需要颜色表,因此真彩色图的BITMAPINFOHEADER结构后面直接就是位图数据。

C语言读取BMP格式图片

C语言读取BMP格式图片

另外需要注意的是这是一个近似值,对于 n 位的位图图像来说,尽管可能有最多 种颜色,一个特定的图像可能并不会使用这些所有的颜色。由于彩色调色板 仅仅定义了图像所用的颜色,所以实际的彩色调色板将小于 如果想知道这些值是如何得到的,请参考下面文件格式的部分。 由于存储算法本身决定的因素, 根据几个图像参数的不同计算出的大小与实际的 文件大小将会有一些细小的差别。 典型的文件格式 。
存储算法
BMP 文件通常是不压缩的,所以它们通常比同一幅图像的压缩图像文件格式要大 很多。例如,一个 800×600 的 24 位几乎占据 1.4MB 空间。因此它们通常不适合 在因特网或者其他低速或者有容量限制的媒介上进行传输。 根据颜色深度的不同,图像上的一个像素可以用一个或者多个字节表示,它由 n/8 所确定(n 是位深度,1 字节包含 8 个数据位)。图片浏览器等基于字节的 ASCII 值计算像素的颜色,然后从调色板中读出相应的值。更为详细的信息请参 阅下面关于位图文件的部分。 n 位 2n 种颜色的包含调色板的位图近似字节数可以用下面的公式计算:
unsigned char r[2000][2000],output_r[2000][2000]; unsigned char g[2000][2000],output_g[2000][2000]; unsigned char b[2000][2000],output_b[2000][2000];
int main(int argc, char* argv[]) { /* Open bmp file */ unsigned char *fp_temp;
bmpFileTest(fpbmp); bmp file or not bmpHeaderPartLength(fpbmp); Header Part BmpWidthHeight(fpbmp); width of the Data Part

在vc下用c语言读bmp文件信息并且改写bmp颜色

在vc下用c语言读bmp文件信息并且改写bmp颜色
在 vc 下用 c 语言读写 bmp 图像信息并且写 bmp 图像的颜色
读者需要的基础: 1.c 语言基础 。 2.会用 vc++ 。 3.了解改 jpg 图像的后缀名来得到 bmp 图像,并不是真正意义的 bmp 图像,这样的图像是不能被 本程序读写的。 5.本程序用的是 24 位的 bmp 图像。
uchar rgbblue; //该颜色的蓝色分量 uchar rgbgreen; //该颜色的绿色分量 uchar rgbred; ////该颜色的红色分量 //uchar rgbReversed; //保留值,这里好像没有。 };
int main() {
struct bmp_header fileheader;//定义一个文件头信息块对象存放读取数据。 struct bmp_information fileinformation;//定义一个图像描述信息块对象存放读取数据。 struct bmp_rgb filergb; //定义一个颜色表(调色板)对象存放读取数据 uchar blue=0;//自定义蓝色分量,用于写进蓝色分量的值,在这里你可以修改三个颜色的分量,改变 bmp 图像的颜色。 uchar green=0;//自定义绿分量,用于写进蓝绿色分量的值 uchar red=255;//自定义红色分量,用于写进红色分量的值 FILE *fp; if((fp=fopen("1.bmp","rb+"))==NULL)//,一定要 rb+,读取并且可写二进制文件。在这里我把我的“1.bmp” 图像放在当前程序下,大家可以自行改变图片的名称和位置,然后在这里自行配置即可。 {
printf("bmp 格式标志:0x%x\n",fileheader.btyde); printf("文件大小: %u\n",fileheader.bsize); printf("保留字 1:%d\n",fileheader.breserved1); printf("保留字 2:%d\n",fileheader.breserved2); printf("位图数据偏移字节数:%u\n",fileheader.bfoffbits); printf("结构体长度: %u\n",fileinformation.bisize); printf("位图宽度: %d\n",fileinformation.bwidth); printf("位图高度: %d\n",fileinformation.bheight); printf("位图平面数: %u\n",fileinformation.bplanes); printf("颜色位数: %u\n",fileinformation.bbitcount); printf("压缩方式:%u\n",fileinformation.bcompression); printf("实际位图数据占用的字节数: %u\n",fileinformation.bmpimagesize); printf("X 方向分辨率:%d\n",fileinformation.bx); printf("Y 方向分辨率: %d\n",fileinformation.by); printf("使用的颜色数:%u\n",fileinformation.bcirused); printf("重要颜色数:%u\n",fileinformation.bcirimportant); printf("红色分量:%u\n",filergb.rgbred); printf("绿色分量:%u\n",filergb.rgbgreen); printf("蓝色分量:%u\n",filergb.rgbblue); fseek(fp,54L,0);//将文件类型指针定位在颜色表(调色板)的开头,便于下面开始写 i=ftell(fp); printf("%d\n",i); for(int j=0;j<fileinformation.bheight;j++)//这里两个循环的意思是保证整个图像的所有像素都被重写 rgb for(int k=0;k<fileinformation.bwidth;k++)

VC界面显示图片(BMP)

VC界面显示图片(BMP)

VC界面显示图片(BMP)1、通过点击浏览按钮选择BMP图像文件点击浏览按钮打开文件对话框选择BMP图像文件,得到文件所在的路径目录。

关键代码如下:char szFilter[] = "BMP Files (*.bmp)|*.bmp|All Files (*.*)|*.*||"; CFileDialog dlg( TRUE,"BMP",NULL,OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,szFilter );if(dlg.DoModal() == IDOK){CString strPathName = dlg.GetPathName();}2、加载BMP文件到内存通过得到的BMP图像文件路径目录,加载BMP图像文件到内存中。

关键代码如下:BOOL CShowBMPDlg::LoadShowBMPFile(const char *pPathname){CFile file;if( !file.Open( pPathname, CFile::modeRead) )return FALSE;DWORD m_nFileLen;m_nFileLen = file.GetLength();m_pBMPBuffer = new char[m_nFileLen + 1];if(!m_pBMPBuffer)return FALSE;if(file.ReadHuge(m_pBMPBuffer,m_nFileLen) != m_nFileLen)return FALSE;return TRUE;}3、将内存中的BMP文件内容转换到HBITMAP将内存中的BMP文件内容转换成位图句柄。

关键代码如下:HBITMAP CShowBMPDlg::BufferToHBITMAP(){HBITMAP hShowBMP;LPSTR hDIB,lpBuffer = m_pBMPBuffer;LPVOID lpDIBBits;BITMAPFILEHEADER bmfHeader;DWORD bmfHeaderLen;bmfHeaderLen = sizeof(bmfHeader);strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);if (bmfHeader.bfType != (*(WORD*)"BM")) return NULL;hDIB = lpBuffer + bmfHeaderLen;BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits; CClientDC dc(this);hShowBMP =CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB _COLORS);return hShowBMP;}4、在屏幕上显示BMP图像双缓冲实现BMP位图显示在屏幕上。

opencv bmp标准格式

opencv bmp标准格式

一、介绍OpenCV是一个开源的计算机视觉库,提供了大量的图像处理和计算机视觉算法,广泛应用于图像处理、模式识别、计算机视觉等领域。

在OpenCV中,BMP(Bitmap)是一种常见的图像文件格式,它以其简单的存储结构和广泛的应用而闻名。

二、BMP格式简介1. BMP图像文件格式是Windows操作系统中最常见的图像文件格式之一。

2. BMP格式的图像数据以像素点阵列存储,每个像素用24位或32位的RGB值表示。

3. BMP格式的文件头包含文件类型、文件大小、图像数据偏移量等信息。

4. BMP格式的图像数据按从左到右、从下到上的顺序排列。

三、OpenCV中的BMP处理1. OpenCV提供了对BMP格式图像文件的读取和写入功能,可以利用OpenCV读取BMP格式的图像文件,并对其进行各种图像处理操作。

2. 通过OpenCV的imread()函数可以读取BMP格式的图像文件,并返回一个Mat对象,方便对图像进行处理。

3. 通过OpenCV的imwrite()函数可以将处理后的图像保存为BMP格式的文件,方便后续的使用和展示。

四、BMP格式的优势1. BMP格式的图像数据存储方式简单,易于理解和处理。

2. BMP格式的图像文件大小相对较小,适合在存储和传输时使用。

3. BMP格式的图像在Windows系统中具有较好的兼容性,可在多种软件和设备中进行展示和使用。

五、BMP格式的局限性1. BMP格式不支持压缩,因此其文件大小相对较大,在存储和传输时可能占用较多的空间和带宽。

2. BMP格式的图像不能包含透明通道信息,无法实现半透明效果。

3. BMP格式不支持多帧图像,无法存储动态图像或视瓶。

六、BMP格式的应用场景1. 由于BMP格式的存储结构简单、易于处理,因此在一些对图像质量要求不高、但对图像处理速度和实时性要求较高的场景中得到广泛应用,如监控摄像头图像处理、工业自动化图像处理等。

2. 由于BMP格式的文件大小相对较小,适合在一些资源受限的环境中进行图像存储和传输,如嵌入式系统、传感器网络等。

将CBitmap类保存为bmp文件(VC++)

将CBitmap类保存为bmp文件(VC++)

做了一个截屏程序,提供了两种功能:将图象保存为文件,保存到剪切板。

后面一种相对简单代码量少,将图像保存为文件相对复杂,网上也有很多这样的函数(但是基本上都来自一个版本),COPY了一个过来,不能运行,但我相信程序的大部分功能是好的,以前也没有接触过类似的东西,所以一步步把它看懂,然后修改正确,也对代码结构作了调整。

相信能被更好的理解。

要保存为BMP文件,首先肯定要了解BMP文件的格式。

网上查资料知BMP文件的结构可以分为三个部分:1,文件的头结构,记录了整个文件的大小,图象类型,MFC类型为BITMAPFILEHEADER 2。

图象信息的头结构,记当了图象的一些信息,如大小,颜色深度等。

类型为:BITMAPINFOHEADER3. 图象各个象素的颜色值,这部分应该是文件的主体了。

有了以上的信息要保存BMP文件的步骤就很明显了。

创建这两个结构,并初始化,边同象素颜色值写入文件即可,我下面的代码遵循的就是这个步骤,所以感觉条理应该比较清楚。

直接上代码(以下代码在VC 6。

0中通过测试)void MySaveBmpT ofile(HBITMAP hbmp, CString path){//参数说明: hbmp :需保存的图象的句柄path :保存路径//定义文件头结构BITMAPFILEHEADER fileHead;int fileHeadLen = sizeof( BITMAPFILEHEADER );//定义图象信息结构BITMAPINFOHEADER bmpHead;int bmpHeadLen =sizeof( BITMAPINFOHEADER );BITMAP bmpObj;GetObject( hbmp, sizeof(BITMAP), &bmpObj );DWORD fileSizeInByte; //文件总的字节大小//获取系统颜色深度,即每个象素用多少位表还示DWORD PixelSizeInBit;CDC srcDC; //系统屏幕设备描述表srcDC.CreateDC( "DISPLAY", NULL, NULL, NULL);PixelSizeInBit=srcDC.GetDeviceCaps( BITSPIXEL ) * srcDC.GetDeviceCaps( PLANES ); fileSizeInByte = fileHeadLen + bmpHeadLen +bmpObj.bmWidth*bmpObj.bmHeight*PixelSizeInBit/8;//初始化文件头结构fileHead.bfOffBits = fileHeadLen + bmpHeadLen;fileHead.bfReserved1=0;fileHead.bfReserved2=0;fileHead.bfSize = fileSizeInByte;fileHead.bfType = 0x4D42;///初始图像信息结构bmpHead.biBitCount = PixelSizeInBit;bmpHead.biCompression = BI_RGB;bmpHead.biPlanes = 1;bmpHead.biHeight = bmpObj.bmHeight;bmpHead.biWidth = bmpObj.bmWidth;bmpHead.biSize = bmpHeadLen;//为文件分配空间PBYTE pFile=new byte[ fileSizeInByte ];memset( pFile, 0, fileSizeInByte );//填充文件头部memcpy( pFile, (PBYTE)&fileHead, fileHeadLen);//填充文件信息头部结构memcpy( pFile+fileHeadLen, (PBYTE)&bmpHead, bmpHeadLen);//填充象素部分GetDIBits( srcDC.m_hDC, hbmp, 0, bmpObj.bmHeight, pFile+fileHeadLen+bmpHeadLen, (LPBITMAPINFO)(pFile+fileHeadLen), DIB_RGB_COLORS);//打开文件并写入数据HANDLE hFile;hFile=CreateFile( path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);if( hFile==INVALID_HANDLE_VALUE ){MessageBox( "创建文件失败" );return;}DWORD nByteTransfered;WriteFile( hFile, pFile, fileSizeInByte, &nByteTransfered, NULL);CloseHandle( hFile );//清理delete pFile;srcDC.DeleteDC();}保存成功以后,可以用16进制编辑器,打开BMP文件,可以按照在pFile中写入的顺序对里面的文件进行解析,第一个双字节正是写入的0x4D42,哈哈。

BMP图像格式详解及VB函数截图保存

BMP图像格式详解及VB函数截图保存

BMP图像格式详解及VB截图保存方法2012-03-06 13:14BMP是一种与硬件设备无关的图像文件格式,使用非常广。

它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。

BMP文件的图像深度可选lbit、4bit、8bit及24bit。

BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。

由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

文件结构:典型的BMP图像文件由四部分组成:1:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。

位图的类型:位图一共有两种类型,即:设备相关位图(DDB)和设备无关位图(DIB)。

DDB位图在早期的Windows系统(Windows 3.0以前)中是很普遍的,事实上它也是唯一的。

然而,随着显示器制造技术的进步,以及显示设备的多样化,DDB位图的一些固有的问题开始浮现出来了。

比如,它不能够存储(或者说获取)创建这张图片的原始设备的分辨率,这样,应用程序就不能快速的判断客户机的显示设备是否适合显示这张图片。

为了解决这一难题,微软创建了DIB位图格式。

设备无关位图 (Device-Independent Bitmap)DIB位图包含下列的颜色和尺寸信息:*原始设备(即创建图片的设备)的颜色格式。

*原始设备的分辨率。

*原始设备的调色板*一个位数组,由红、绿、蓝(RGB)三个值代表一个像素。

*一个数组压缩标志,用于表明数据的压缩方案(如果需要的话)。

C语言BMP图片处理

C语言BMP图片处理

C语言 BMP图片处理BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图。

它一般由4部分组成:文件头信息块、图像描述信息块、颜色表(在真彩色模式无颜色表)和图像数据区组成。

在系统中以BMP为扩展名保存。

打开Windows的画图程序,在保存图像时,可以看到三个选项:2色位图(黑白)、16色位图、256色位图和24位位图。

这是最普通的生成位图的工具,在这里讲解的BMP位图形式,主要就是指用画图生成的位图(当然,也可以用其它工具软件生成)。

现在讲解BMP的4个组成部分:1.文件头信息块0000-0001:文件标识,为字母ASCII码“BM”。

0002-0005:文件大小。

填写。

0006-0009:保留,每字节以“00”000A-000D:记录图像数据区的起始位置。

各字节的信息依次含义为:文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为01)。

2.图像描述信息块000E-0011:图像描述信息块的大小,常为28H。

0012-0015:图像宽度。

0016-0019:图像高度。

001A-001B:图像的plane(平面?)总数(恒为1)。

001C-001D:记录像素的位数,很重要的数值,图像的颜色数由该值决定。

001E-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩)。

0022-0025:图像区数据的大小。

0026-0029:水平每米有多少像素,在设备无关位图(.DIB)中,每字节以00H 填写。

002A-002D:垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以00H 填写。

002E-0031:此图像所用的颜色数,如值为0,表示所有颜色一样重要。

3.颜色表颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为1024字节。

其中,每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha(像素的透明度值,一般不需要)。

VC中保存BMP位图文件的方法及BMP文件格式带源码实现

VC中保存BMP位图文件的方法及BMP文件格式带源码实现

#include "stdio.h"#include "Windows.h"//几个全局变量,存放读入图像的位图数据、宽、高、颜色表及每像素所占位数(比特) //此处定义全局变量主要为了后面的图像数据访问及图像存储作准备unsigned char *pBmpBuf;//读入图像数据的指针int bmpWidth;//图像的宽int bmpHeight;//图像的高RGBQUAD *pColorT able;//颜色表指针int biBitCount;//图像类型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;}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 * biBitCount/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) + colorT ablesize + lineByte*height;fileHead.bfReserved1 = 0;fileHead.bfReserved2 = 0;//bfOffBits是图像文件前三个部分所需空间之和fileHead.bfOffBits=54+colorTablesize;//写文件头进文件fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);//申请位图信息头结构变量,填写信息头信息BITMAPINFOHEADER head;head.biBitCount=biBitCount;head.biClrImportant=0;head.biClrUsed=0;head.biCompression=0;head.biHeight=height;head.biPlanes=1;head.biSize=40;head.biSizeImage=lineByte*height;head.biWidth=width;head.biXPelsPerMeter=0;head.biYPelsPerMeter=0;//写位图信息头进内存fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);//如果灰度图像,有颜色表,写入文件if(biBitCount==8)fwrite(pColorTable, sizeof(RGBQUAD),256, fp);//写位图数据进文件fwrite(imgBuf, height*lineByte, 1, fp);//关闭文件fclose(fp);return 1;}//调色板与灰度图像的关系void main(){//读入指定BMP文件进内存char readPath[]="tarret.BMP";readBmp(readPath);//输出图像的信息printf("width=%d,height=%d,biBitCount=%d\n",bmpWidth,bmpHeight,biBit Count);//改变灰度图像的颜色表蓝色分量的值,察看前后变化if(biBitCount==8){for(int i=0; i<256;i++){pColorTable[i].rgbBlue = 255-pColorTable[i].rgbBlue;}}//将图像数据存盘char writePath[]="tarret1.BMP";saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorT able);//清除缓冲区,pBmpBuf和pColorT able是全局变量,在文件读入时申请的空间delete []pBmpBuf;if(biBitCount==8)delete []pColorTable;}。

BMP24位位图格式总结

BMP24位位图格式总结

图像BMP24位位图格式总结1、创建图片创建一张只有六个像素的图片(两行三列),每个像素的颜色RGB组合值如图1(示意图)所示:图12、windows系统下存储格式(使用WinHex打开)3、文件结构3.1 文件头(bmp file header),提供文件的格式、大小等信息,共14个字节,如图2所示。

图23.1.1 0-1字节(2个字节)0x42 0x4d = "BM",表示这是Windows支持的位图格式,如图3所示。

图33.1.2 2-5字节(4个字节),表示该bmp文件的大小,存储形式为图4所示,因为小端对齐形式存储,实际存储的16进制数为0x4e,转换为十进制为78,与我们直接查看此图片的属性所看到的文件大小一致。

注:对于arm,intel这种x86架构的复杂指令CPU,整数在内存中是倒着存放的,低地址放低位,高地址放高位,小端对齐,但对于unix服务器的CPU,更多是采用大端对齐的情况图43.1.3 6-9字节这是两个保留段,为0如图5所示。

图53.1.4 A-D字节如图6所示,存储数据为0x36,十进制为54,表示的意义为从文件头到位图数据需偏移54字节。

图63.2 位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息,40个字节,如图7所示。

图73.2.1 0E-11字节,如图8所示,存储数据为0x28,十进制为40,表示意义为:位图信息头的大小为40个字节。

图83.2.2 12-15字节,如图9所示,存储数据为0x03,十进制为3,表示意义为:图像宽为3个像素,与我们创建的图像一致。

图93.2.3 16-19字节,如图10所示,存储数据为0x02,十进制为2,表示意义为:图像高为2个像素,与我们创建的图像一致。

图103.2.4 1A-1B字节,如图11所示,存储数据为0x01,该值总为1,表示意义为位元面数。

VC下显示位图的几种方法

VC下显示位图的几种方法

VC下显示位图的几种方法VC下显示位图的几种方法 VC下显示位图的几种方法总结一下关于位图的几种用法。

说到这还是开头给大家介绍一下,有关位图的知识吧,以及对于我们比较有用的几个关于位图的结构体。

一.位图结构如下:---- 一、BMP文件结构---- 1. BMP文件组成---- BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。

---- 2. BMP文件头---- BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。

---- 其结构定义如下:typedef struct tagBITMAPFILEHEADER{WORDbfType; // 位图文件的类型,必须为BMDWORD bfSize; // 位图文件的大小,以字节为单位WORDbfReserved1; // 位图文件保留字,必须为0WORDbfReserved2; // 位图文件保留字,必须为0DWORD bfOffBits; // 位图数据的起始位置,以相对于位图// 文件头的偏移量表示,以字节为单位} BITMAPFILEHEADER;---- 3. 位图信息头BMP位图信息头数据用于说明位图的尺寸等信息。

typedef struct tagBITMAPINFOHEADER{DWORD biSize; // 本结构所占用字节数LONGbiWidth; // 位图的宽度,以像素为单位LONGbiHeight; // 位图的高度,以像素为单位WORD biPlanes; // 目标设备的级别,必须为1WORD biBitCount// 每个像素所需的位数,必须是1(双色),// 4(16色),8(256色)或24(真彩色)之一DWORD biCompression; // 位图压缩类型,必须是 0(不压缩), // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一DWORD biSizeImage; // 位图的大小,以字节为单位LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数LONGbiYPelsPerMeter; // 位图垂直分辨率,每米像素数DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数DWORD biClrImportant;// 位图显示过程中重要的颜色数} BITMAPINFOHEADER;---- 4. 颜色表颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
那么,不压缩情况下位图数据的大小(BITMAPINFOHEADER结构中的biSizeImage成员)计算如下:
biSizeImage = DataSizePerLine * biHeight
第二,一般来说,BMP文件的数据是从图像的左下角开始逐行扫描图像的,即从下到上、从左到右,将图像的像素值一一记录下来,因此图像坐标零点在图像左下角。
— rgbRed:该颜色的红色分量;
— rgbReserved:保留字节,暂不用。
有些位图需要颜色表;有些位图(如真彩色图)则不需要颜色表,颜色表的长度由BITMAPINFOHEADER结构中biBitCount分量决定。对于biBitCount值为1的二值图像,每像素占1bit,图像中只有两种(如黑白)颜色,颜色表也就有21=2个表项,整个颜色表的大小为 个字节;对于biBitCount值为8的灰度图像,每像素占8bit,图像中有28=256种颜色,颜色表也就有256个表项,且每个表项的R、G、B分量相等,整个颜色表的大小为 个字节;而对于biBitCount=24的真彩色图像,由于每像素3个字节中分别代表了R、G、B三分量的值,此时不需要颜色表,因此真彩色图的BITMAPINFOHEADER结构后面直接就是位图数据。
1.2.1 BMP文件结构
如图1-7所示,BMP图像文件被分成4个部分:位图文件头(Bitmap File Header)、位图信息头(Bitmap Info Header)、颜色表(Color Map)和位图数据(即图像数据,Data Bits或Data Body)。
第1部分为位图文件头BITMAPFILEHEADER,是一个结构体类型,该结构的长度是固定的,为14个字节。其定义如下:
1.2 BMP文件结构及其存取
数字图像在外存储器设备中的存储形式是图像文件,图像必须按照某个已知的、公认的数据存储顺序和结构进行存储,才能使不同的程序对图像文件顺利进行打开或存盘操作,实现数据共享。图像数据在文件中的存储顺序和结构称为图像文件格式。目前广为流传的图像文件格式有许多种,常见的格式包括BMP、GIF、JPEG、TIFF、PSD、DICOM、MPEG等。在各种图像文件格式中,一部分是由某个软硬件厂商提出并被广泛接受和采用的格式,例如BMP、GIF和PSD格式;另一部分是由各种国际标准组织提出的格式,例如JPEG、TIFF和DICOM,其中JPEG是国际静止图像压缩标准组织提出的格式,TIFF是由部分厂商组织提出的格式,DICOM是医学图像国际标准组织提出的医学图像专用格式。
*
*说明:给定一个图像文件名及其路径,读图像的位图数据、宽、高、颜色表及每像素
* 位数等数据进内存,存放在相应的全局变量中
***********************************************************************/
bool readBmp(char *bmpName)
DWORD biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
BITMAPINFOHEADER结构的各个域的详细说明如下:
— biSize:本结构的长度,为40个字节。
int bmpHeight;//图像的高
RGBQUAD *pColorTable;//颜色表指针
int biBitCount;//图像类型,每像素位数
根据BMP文件结构,BMP文件读入操作的基本流程如图1-8所示。
图1-8 BMP文件读入操作流程图
readBmp()函数实现了BMP文件的读取操作,下面的代码是对readBmp()函数的说明和实现。
— bfSize:位图文件大小,包括这14个字节。
— bfReserved1, bfReserved2:Windows保留字,暂不用。
— bfOffBits:从文件头到实际的位图数据的偏移字节数,图1-7中前3个部分的长度之和。
图1-7 BMP文件结构示意图
第2部分为位图信息头BITMAPINFOHEADER,也是一个结构体类型的数据结构,该结构的长度也是固定的,为40个字节(WORD为无符号16位整数,DWORD为无符号32位整数,LONG为32位整数)。其定义如下:
//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
BITMAPINFOHEADER head;
fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);
//获取图像宽、高、每像素所占位数等信息
bmpWidth = head.biWidth;
第4部分是位图数据,即图像数据,其紧跟在位图文件头、位图信息头和颜色表(如果有颜色表的话)之后,记录了图像的每一个像素值。对于有颜色表的位图,位图数据就是该像素颜色在调色板中的索引值;对于真彩色图,位图数据就是实际的R、G、B值(三个分量的色和真彩色位图的位图数据进行说明:
{
//二进制读方式打开指定的图像文件
FILE *fp=fopen(bmpName,"rb");
if(fp==0) return 0;
//跳过位图文件头结构BITMAPFILEHEADER
fseek(fp, sizeof(BITMAPFILEHEADER),0);
/***********************************************************************
* 函数名称:
* readBmp()
*
*函数参数:
* char *bmpName -文件名字及路径
*
*返回值:
* 0为失败,1为成功
typedef struct tagBITMAPFILEHEADER
{
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
第一,Windows规定一个扫描行所占的字节数必须是4的倍数,不足4的倍数则要对其进行扩充。假设图像的宽为biWidth个像素、每像素biBitCount个比特,其一个扫描行所占的真实字节数的计算公式如下:
DataSizePerLine = (biWidth * biBitCount /8+ 3) / 4*4
— biCompresssion:位图压缩类型,有效的值为BI_RGB(未经压缩)、BI_RLE8、BI_RLE4、BI_BITFILEDS(均为Windows定义常量)。这里只讨论未经压缩的情况,即biCompression=BI_RGB。
— biSizeImage:实际的位图数据占用的字节数,该值的大小在第4部分位图数据中有具体解释。
1.BMP文件的读入
BMP文件分为4个组成部分,那么BMP文件的读入也要按照4个组成部分依次进行处理,即先处理BITMAPFILEHEADER结构,然后是BITMAPINFOHEADER结构、颜色表,最后是位图数据。
首先,有关BITMAPFILEHEADER、BITMAPINFOHEADER、RGBQUAD等结构的定义包含在头文件“Windows.h”中,应把其包含进来。
— biXPelsPerMeter:指定目标设备的水平分辨率,单位是像素/米。
— biYPelsPerMeter:指定目标设备的垂直分辨率,单位是像素/米。
— biClrUsed:位图实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次幂。
— biClrImportant:位图显示过程中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
#include "Windows.h"
其次,为了后面对图像进行修改及存盘方便,我们定义了几个全局变量,用来存放读入图像的位图数据、宽、高、颜色表及每像素位数等信息。所定义的全局变量如下:
unsigned char *pBmpBuf;//读入图像数据的指针
int bmpWidth;//图像的宽
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
BITMAPFILEHEADER结构的各个域详细说明如下:
— bfType:位图文件类型,必须是0x424D,即字符串“BM”,也就是说,所有的“*.bmp”文件的头两个字节都是“BM”。
bmpHeight = head.biHeight;
biBitCount = head.biBitCount;
— biWidth:位图的宽度,以像素为单位。
— biHeight:位图的高度,以像素为单位。
— biPlanes:目标设备的级别,必须是1。
— biBitCount:每个像素所占的位数(bit),其值必须为1(黑白图像)、4(16色图)、8(256色)、24(真彩色图),新的BMP格式支持32位色。
第3部分为颜色表。颜色表实际上是一个RGBQUAD结构的数组,数组的长度由biClrUsed指定(如果该值为零,则由biBitCount指定,即2的biBitCount次幂个元素)。RGBQUAD结构是一个结构体类型,占4个字节,其定义如下:
相关文档
最新文档