正在加载图片...
第三部分为调色板 Palette,当然,这里是对那些需要调色板的位图文件而言的。有些位图, 如真彩色图,前面已经讲过,是不需要调色板的, BITMAPINFOHEADER后直接是位图数 据 调色板实际上是一个数组,共有 biClrUsed个元素(如果该值为零,则有2boun个元素) 数组中每个元素的类型是一个 RGBQUAD结构,占4个字节,其定义如下: typedef struct tagRGBQUAD i BYTE rgbBlue;∥该颜色的蓝色分量 BYTE rgb Greer,∥该颜色的绿色分量 BYTE rgbRed;∥该颜色的红色分量 BYTE rgbReserved,∥保留值 9 RGBQUAD, 第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就是该象素颜在调色板 中的索引值。对于真彩色图,图象数据就是实际的R、G、B值。下面针对2色、16色、256 色位图和真彩色位图分别介绍。 对于2色位图,用1位就可以表示该象素的颜色(一般0表示黑,1表示白),所以一个字节 可以表示8个象素 对于16色位图,用4位可以表示一个象素的颜色,所以一个字节可以表示2个象素。 对于256色位图,一个字节刚好可以表示1个象素。 对于真彩色图,三个字节才能表示1个象素,哇,好费空间呀!没办法,谁叫你想让图的颜 色显得更亮丽呢,有得必有失嘛 要注意两点 (1)每一行的字节数必须是4的整倍数,如果不是,则需要补齐。这在前面介绍 bisizelmage 时已经提到了。 (2)一般来说,bMP文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的 是图象最下面一行的左边第一个象素,然后是左边第二个象素.接下来是倒数第二行左边 第一个象素,左边第二个象素.依次类推,最后得到的是最上面一行的最右一个象素。 好了,终于介绍完bmp文件结构了,是不是觉得头有些大?别着急,对照着下面的程序, 你就会很清楚了(我最爱看源程序了,呵呵)。 13显示一个bmp文件的C程序 下面的函数 Load BmpFile,其功能是从一个bmp文件中读取数据(包括 BITMAPINFOHEADER,调色板和实际图象数据),将其存储在一个全局内存句柄 hImgData 中,这个 hImgData将在以后的图象处理程序中用到。同时填写一个类型为 HBITMAP的全 局变量 hBitmap和一个类型为 HPALETTE的全局变量 pAlette。这两个变量将在处理 WM PAINT消息时用到,用来显示位图。该函数的两个参数分别是用来显示位图的窗口句 柄,和bmp文件名(全路径)。当函数成功时,返回TRUE,否则返回 FALSE。 bItmapfileheader bf第三部分为调色板 Palette,当然,这里是对那些需要调色板的位图文件而言的。有些位图, 如真彩色图,前面已经讲过,是不需要调色板的,BITMAPINFOHEADER 后直接是位图数 据。 调色板实际上是一个数组,共有 biClrUsed 个元素(如果该值为零,则有 2 biBitCount 个元素)。 数组中每个元素的类型是一个 RGBQUAD 结构,占 4 个字节,其定义如下: typedef struct tagRGBQUAD { BYTE rgbBlue; //该颜色的蓝色分量 BYTE rgbGreen; //该颜色的绿色分量 BYTE rgbRed; //该颜色的红色分量 BYTE rgbReserved; //保留值 } RGBQUAD; 第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就是该象素颜在调色板 中的索引值。对于真彩色图,图象数据就是实际的 R、G、B 值。下面针对 2 色、16 色、256 色位图和真彩色位图分别介绍。 对于 2 色位图,用 1 位就可以表示该象素的颜色(一般 0 表示黑,1 表示白),所以一个字节 可以表示 8 个象素。 对于 16 色位图,用 4 位可以表示一个象素的颜色,所以一个字节可以表示 2 个象素。 对于 256 色位图,一个字节刚好可以表示 1 个象素。 对于真彩色图,三个字节才能表示 1 个象素,哇,好费空间呀!没办法,谁叫你想让图的颜 色显得更亮丽呢,有得必有失嘛。 要注意两点: (1) 每一行的字节数必须是 4 的整倍数,如果不是,则需要补齐。这在前面介绍 biSizeImage 时已经提到了。 (2) 一般来说,.bMP 文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的 是图象最下面一行的左边第一个象素,然后是左边第二个象素……接下来是倒数第二行左边 第一个象素,左边第二个象素……依次类推 ,最后得到的是最上面一行的最右一个象素。 好了,终于介绍完 bmp 文件结构了,是不是觉得头有些大?别着急,对照着下面的程序, 你就会很清楚了(我最爱看源程序了,呵呵)。 1.3 显示一个 bmp 文件的 C 程序 下面的函数 LoadBmpFile ,其功能是从一个 .bmp 文件中读取数据 ( 包 括 BITMAPINFOHEADER,调色板和实际图象数据),将其存储在一个全局内存句柄 hImgData 中,这个 hImgData 将在以后的图象处理程序中用到。同时填写一个类型为 HBITMAP 的全 局变量 hBitmap 和一个类型为 HPALETTE 的全局变量 hPalette。这两个变量将在处理 WM_PAINT 消息时用到,用来显示位图。该函数的两个参数分别是用来显示位图的窗口句 柄,和.bmp 文件名(全路径)。当函数成功时,返回 TRUE,否则返回 FALSE。 BITMAPFILEHEADER bf;
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有