设为首页 加入收藏

TOP

DOS下显示8位256色BMP位图(三)
2014-11-23 23:39:53 来源: 作者: 【 】 浏览:39
Tags:DOS 显示 8位 256 BMP位图
D结构体。(多少位的图片就是用多少位来表示一个颜色信息,例如4位图片表示用4个bit来表示 一个颜色信息。)一个bmp文件中有没有RGBQUAD结构体,可以根据前面BITMAPFILEHEADER结构体的第5个属性bfOffBits来判 断,因为BITMAPINFOHEADER结构体长度为40bit,如果BITMAPINFOHEADER结构体结束后还未到DIB数据区的偏移量,就说 明接下来的数据是RGBQUAD结构体部分。这里讲的C:\WINDOWS\Blue Lace 16.bmp是一个4bit图片,所以它带有RGBQUAD结构体。

3、BITMAPINFOHEADER部分。

下面进入正题BITMAPINFOHEADER部分。

第1个属性是biSize(4字节),表示BITMAPINFOHEADER结构体的长度,最常见的长度是40字节,UltraEdit中可以看到紧接着的4个字节等于&H00000028=40字节。

第2个属性是biWidth(4字节),表示bmp图片的宽度,这里等于&H00000030=48像素。

第3个属性是biHeight(4字节),表示bmp图片的高度,这里等于&H00000030=48像素。

第4个属性是biPlanes(2字节),表示bmp图片的平面属,显然显示器只有一个平面,所以恒等于1,这里等于&H0001。

第5个属性是biBitCount(2字节),表示bmp图片的颜色位数,即24位图、32位图等等。

这里等于&H0004,表示该图片为4位图。

第6个属性是biCompression(4字节),表示图片的压缩属性,bmp图片是不压缩的,等于0,所以这里为&H00000000。

第7个属性是biSizeImage(4字节),表示bmp图片数据区的大小,当上一个熟悉biCompression等于0时,这里的值可以省略不填,所以这里等于&H00000000。

第8个属性是biXPelsPerMeter(4字节),表示图片X轴每米多少像素,可省略,这里等于&H00000EC3=3779像素/米。

第9个属性是biYPelsPerMeter(4字节),表示图片Y轴每米多少像素,可省略,这里等于&H00000EC3=3779像素/米。

第10个属性是biClrUsed(4字节),表示使用了多少个颜色索引表,一般biBitCount属性小于16才会用到,等于0时表示有2^biBitCount个颜色索引表,所以这里仍等于&H00000000。

第11个属性是biClrImportant(4字节),表示有多少个重要的颜色,等于0时表示所有颜色都很重要,所以这里等于&H00000000。

至此BITMAPINFOHEADER结构体结束。

4、RGBQUAD结构体

由于这个图片到这里还未到达DIB数据区的偏移量,所以接下来的部分是RGBQUAD结构体。

RGBQUAD结构体由4个字节型数据组成,所以一 个RGBQUAD结构体只占用4字节空间,从左到右每个字节依次表示(蓝色,绿色,红色,未使用)。举例的这个图片我数了数总共有16个RGBQUAD结 构体,由于该图片是4位图,2^4正好等于16,所以它把16种颜色全部都枚举出来了,这些颜色就是一个颜色索引表。颜色索引表编号从0开始,总共16个 颜色,所以编号为0-15。从UltraEdit中可以看到按照顺序,这16个

RGBQUAD结构体依次为:

编号:(蓝,绿,红,空)

0号:(00,00,00,00)

1号:(00,00,80,00)

2号:(00,80,00,00)

3号:(00,80,80,00)

4号:(80,00,00,00)

5号:(80,00,80,00)

6号:(80,80,00,00)

7号:(80,80,80,00)

8号:(C0,C0,C0,00)

9号:(00,00,FF,00)

10号:(00,FF,00,00)

11号:(00,FF,FF,00)

12号:(FF,00,00,00)

13号:(FF,00,FF,00)

14号:(FF,FF,00,00)

15号:(FF,FF,FF,00)

为了更直观的表示这些颜色,可以见后面的图片。

到这里,正好满足DIB数据区的偏移量,所以后面的字节就是图片内容了。这里需要提醒的是所有的DIB数据扫描行是上下颠倒的,也就是说一幅图片先绘制底部的像素,再绘制顶部的像素,所以这些DIB数据所表示的像素点就是从图片的左下角开始,一直表示到图片的右上角。

由于这里的图片是4位图片,也就是说4bit就表示一个像素,一个字节有8个bit,所以一个字节能表示2个像素。

从UltraEdit中可以看到,DIB数据区第一个字节是&H44,16进制正好是将2进制数每4个一组书写的,跟4bit图片正好吻 合,所以&H44表示两个像素,高位的4表示第一个像素,低位的4表示第二个像素。这里的4不是表示RGB颜色,而是表示颜色索引号为4,由于索 引号从0开始编号的,所以4表示索引表中第5个颜色,从附图中可以看到索引号为4的是蓝色。这是第一字节,表示的是图片左下角开始2个像素,如果有PhotoShop打开这个图片可以看到,左下角2个像素取出来的颜色RGB值正好等于索引表中第5个颜色的RGB值。后面的DIB数据以此类推。

至此一个bmp图片就全部解析完了,根据这些信息就可以完整的绘制一张bmp图片来。

============================================

如果你还不明白,还有:

1. BMP文件组成

BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。

2. BMP文件头

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

其结构定义如下:

typedef struct tagBITMAPFILEHEADER

{

WORDbfType; // 位图文件的类型,必须为BM

DWORD bfSize; // 位图文件的大小,以字节为单位

WORDbfReserved1; // 位图文件保留字,必须为0

WORDbfReserved2; // 位图文件保留字,必须为0

DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位

} BITMAPFILEHEADER;

3. 位图信息头

BMP位图信息头数据用于说明位图的尺寸等信息。

typedef struct tagBITMAPINFOHEADER{

DWORD biSize; // 本结构所占用字节数

LONGbiWidth; // 位图的宽度,以像素为单位

LONGbiHeight; // 位图的高度,以像素为单位

WORD biPlanes; // 目标设备的级别,必须为1

WORD biBitCount // 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一

DWORD biCompression; // 位图压缩类型,必须是

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇可变参数宏__VA_ARGS__ 下一篇在对话框显示出来后立即执行一段..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: