非压缩位图文件大小的计算问题?
又是一年一度的男人节日了,借着这个问题给大家送祝福,祝天下光棍齐欢乐,有情人终成眷属.
------解决方案--------------------如今Windows(3.x       以及95,98,NT)系列已经成为绝大多数用户使用的操作系统,它比      
   DOS       成功的一个重要因素是它可视化的漂亮界面。那么Windows       是如何显示图象的呢?这      
   就要谈到位图(bitmap)。      
   我们知道,普通的显示器屏幕是由许许多多点构成的,我们称之为象素。显示时采用扫描      
   的方法:电子枪每次从左到右扫描一行,为每个象素着色,然后从上到下这样扫描若干      
   行,就扫过了一屏。为了防止闪烁,每秒要重复上述过程几十次。例如我们常说的屏幕分      
   辨率为640×480,刷新频率为70Hz,意思是说每行要扫描640       个象素,一共有480       行,每      
   秒重复扫描屏幕70       次。      
   我们称这种显示器为位映象设备。所谓位映象,就是指一个二维的象素矩阵,而位图就是      
   采用位映象方法显示和存储的图象。举个例子,图1.1       是一幅普通的黑白位图,图1.2       是被      
   放大后的图,图中每个方格代表了一个象素。我们可以看到:整个骷髅就是由这样一些黑      
   点和白点组成的。      
   图1.1       骷髅      
   图1.2       放大后的骷髅位图      
   那么,彩色图是怎么回事呢?      
   我们先来说说三元色RGB概念。      
   我们知道,自然界中的所有颜色都可以由红、绿、蓝(R,G,B)组合而成。有的颜色含有      
   红色成分多一些,如深红;有的含有红色成分少一些,如浅红。针对含有红色成分的多      
   少,可以分成0       到255       共256       个等级,0       级表示不含红色成分;255       级表示含有100%的红      
   色成分。同样,绿色和蓝色也被分成256       级。这种分级概念称为量化。      
   这样,根据红、绿、蓝各种不同的组合我们就能表示出256×256×256,约1600       万种颜色。      
   这么多颜色对于我们人眼来说已经足够丰富了。      
   表1.1       常见颜色的RGB       组合值      
   颜色R       G       B      
   红255       0       0      
   蓝0       255       0      
   绿0       0       255      
   黄255       255       0      
   紫255       0       255      
   bmp       文件格式      
   介绍完位图和调色板的概念,下面就让我们来看一看Windows       的位图文件(.bmp       文件)的格      
   式是什么样子的。      
   bmp       文件大体上分成四个部分,如图1.3       所示。      
   位图文件头BITMAPFILEHEADER      
   位图信息头BITMAPINFOHEADER      
   调色板Palette      
   实际的位图数据ImageDate      
   图1.3       Windows       位图文件结构示意图      
   第一部分为位图文件头BITMAPFILEHEADER,是一个结构,其定义如下:      
   typedef       struct       tagBITMAPFILEHEADER       {      
   WORD       bfType;      
   DWORD       bfSize;      
   WORD       bfReserved1;      
   WORD       bfReserved2;      
   DWORD       bfOffBits;      
   }       BITMAPFILEHEADER;      
   这个结构的长度是固定的,为14       个字节(WORD       为无符号16       位整数,DWORD       为无符号      
   32       位整数),各个域的说明如下:      
   bfType      
   指定文件类型,必须是0x424D,即字符串“BM”,也就是说所有.bmp       文件的头两个字节      
   都是“BM”。      
   bfSize      
   指定文件大小,包括这14       个字节。      
   bfReserved1,bfReserved2      
   为保留字,不用考虑      
   bfOffBits      
   为从文件头到实际的位图数据的偏移字节数,即图1.3       中前三个部分的长度之和。      
   第二部分为位图信息头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;      
   这个结构的长度是固定的,为40       个字节(LONG       为32       位整数),各个域的说明如下:      
   biSize      
   指定这个结构的长度,为40。      
   biWidth      
   指定图象的宽度,单位是象素。      
   biHeight      
   指定图象的高度,单位是象素。      
   biPlanes      
   必须是1,不用考虑。      
   biBitCount      
   指定表示颜色时要用到的位数,常用的值为1(黑白二色图),       4(16       色图),       8(256       色),       24(真彩色      
   图)(新的.bmp       格式支持32       位色,这里就不做讨论了)。      
   biCompression      
   指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些      
   Windows       定义好的常量)。要说明的是,Windows       位图可以采用RLE4,和RLE8       的压缩格      
   式,但用的不多。我们今后所讨论的只有第一种不压缩的情况,即biCompression       为      
   BI_RGB的情况。      
   biSizeImage