分类：电脑/网络-互联网
问题：下载的东西里有bmp文件那是什么意思 
回答：BMP文件是一种常用的图像文件格式前言BMP文件的读取及显示是一个难度不大而又相当重要的工作。对BMP文件格式已都有详细介绍,本文主要致力于非压缩BMP读取及显示的实践工作,实现了8位及24位BMP文件的读取,并列出解析过程中所遇到的难点。bmp文件格式简介:1、8位的bmp文件主要有以下三部分依次组成:头部.调色板信息.(按b,g,r,reversed的顺序存放各调色板的颜色信息,共256个)主数据区(存放各个像素对应的调色板的序号)2、24位的bmp文件主要有以下两部分依次组成.头部信息.主数据区(按b,g,r的顺序存放各像素的信息)3、相关的结构体:3.1头部信息结构体:a)位图文件头typedefstructtagBITMAPFILEHEADER{//bmfhWORDbfType;DWORDbfSize;WORDbfReserved1;WORDbfReserved2;DWORDbfOffBits;}BITMAPFILEHEADER;其中的bfType值应该是“BM”(0x4d42),标志该文件是位图文件。bfSize的值是位图文件的大小b)位图信息头typedefstructtagBITMAPINFOHEADER{//bmihDWORDbiSize;LONGbiWidth;//以像素为单位的图像宽度LONGbiHeight;//以像素为单位的图像长度WORDbiPlanes;WORDbiBitCount;//每个像素的位数DWORDbiCompression;DWORDbiSizeImage;LONGbiXPelsPerMeter;LONGbiYPelsPerMeter;DWORDbiClrUsed;DWORDbiClrImportant;}BITMAPINFOHEADER;3.2、调色板数据结构体:(8位中使用)typedefstruct{BYTEb;BYTEg;BYTEr;BYTEreserved;}paletteRGB;3.3、主数据区BGR颜色结构:(24位中使用)typedefstruct{BYTEb;BYTEg;BYTEr;}structRGB;解析工作:1、SetPixel函数在windowsvc编译环境下,使用sdk编程方式,画像素点的函数为:COLORREFSetPixel(intx,inty,COLORREFcrColor);其中,COLORREF类型的颜色值是这样定义的:crColor=b<<16+g<<8+r;或等价于crColor=b*65536+g*256+r;2、Windows环境下扫描行的字节数:Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充.这一点相当重要,忽视这点将导致错误发生.我的解决方案如下:externWidth=( Width* BitCount)/8;//计算每行实际的字节宽度if(externWidth%4!=0)//计算应补足的字节数.externWidth=4-externWidth%4;elseexternWidth=0;核心代码:这里只列出核以的代码段,详细代码请参阅源码://头部解析voidBMParse::showHeadInfo(){assertF(mInputFile!=NULL,"inshowHeadInfo,mInputFileisnull\n");fread(&mBMFileStr,sizeof(BMPFileStr),1,mInputFile);fread(&mBMFileInfo,sizeof(BMPFileInfo),1,mInputFile);// Type= Type; Size= Size1+ Size2*65536; served1= served1; served2= served2; Offset= Offset1+ Offset2*65536;return;}//颜色区(8位的带调色板)解析:voidBMParse::parseBMPMatrix(){if( Type!=19778){cout<<"Thisisnotabmpfile"<<endl;return;}if( Compression!=0){cout<<"Fileiscompressed"<<endl;return;}inti,j;structRGBtmpRGB;BYTEtmpData;intexternWidth;bmpMatrix=(unsignedlong**)malloc(sizeof(unsignedlong*)* Height);for(i=0;i< Height;i++)bmpMatrix[i]=(unsignedlong*)malloc(sizeof(unsignedlong)* Width);//bmpfilestructureinwindows,keep%4==0inrowbytenum.externWidth=( Width* BitCount)/8;if(externWidth%4!=0)xternWidth=4-externWidth%4;elseexternWidth=0;switch( BitCount){case8:paletteArr=(paletteRGB*)malloc(sizeof(paletteRGB)*256);for(i=0;i<256;i++){fread(&paletteArr[i],sizeof(paletteRGB),1,mInputFile);fseek(mInputFile,1078,SEEK_SET);for(j= Height-1;j>=0;j--){for(i=0;i< Width;i++){fread(&tmpData,sizeof(BYTE),1,mInputFile);bmpMatrix[j][i]=((unsignedlong)paletteArr[tmpData].b)*65536+((unsignedlong)paletteArr[tmpData].g)*256+(unsignedlong)paletteArr[tmpData].r;}/*补齐位调整*/for(i=0;i<externWidth;i++)fread(&tmpData,sizeof(BYTE),1,mInputFile);}break;case16:printf("notfinished\n");break;case24:for(j= Height-1;j>=0;j--){for(i=0;i< Width;i++){fread(&tmpRGB,sizeof(structRGB),1,mInputFile);bmpMatrix[j][i]=((unsignedlong)tmpRGB.b)*65536+((unsignedlong)tmpRGB.g)*256+(unsignedlong)tmpRGB.r;}/*补齐位调整*/for(i=0;i<externWidth;i++)fread(&tmpData,sizeof(BYTE),1,mInputFile);}break; ("bmBitCount:%dnotfinished\n", BitCount);reak;}}//显示程序段:voidBMParse::showBMP(HDCinHdc){inti,j;for(j=0;j< Height;j++)for(i=0;i< Width;i++){SetPixel(inHdc,i,j,bmpMatrix[j][i]);}}实验结论:本文对Windows下非压缩8位及24位位图的解析进行了有益的总结并加以实践,有较强的针对性.可以对需要参考的人士起到一定的帮助作用。