没有合适的资源?快使用搜索试试~ 我知道了~
1.解析256色位图需要注意的一些问题 2.BMP位图格式详解 3.调色板 4.256色位图格式与256色位图编程
资源推荐
资源详情
资源评论
解析
256
色位图需要注意的一些问题
按照位图格式,256 色以下(含)的位图都有调色板,也就是说除了 54 个字节的文件头
和信息头,还有一定大小的调色板数据在里面。以 256 色位图为例,我们可以计算一下它
的调色板有多少字节。上篇文章讲过,一个颜色的调色板数据占用 4 个字节,而 256 中颜
色,一共是 1024 字节,所以调色板数据一共占有 1024 字节,加上 54 字节的信息,则除
了真正的图象数据外,还附加有 1078 字节的非图象数据。这样,我们可以计算出一张
200*150 的图片文件大小。因为图象数据每个像素点是用一个字节表示的,所以数据占有
30000 字节,加上 1078 字节,一共是 31078 字节。这个是显然的。当然,这幅位图无论
是一张白纸或者是复杂的图象,图片大小是不会有变化的,因为 30000 字节的数据是逐个
像素表示的,无论像素是什么颜色,都不可以省略。
那么我们在计算一个 343*260 256 色的位图文件大小,343*260=89180,再加上 1078 等
于 90258,但是通过属性查看,文件大小为 90518 字节,和计算有较大的差距,这说明计
算方法有问题。
其实,200*150 的图象只是一个特例。位图规定,如果图象数据一行的数据,不是 4 的整
数倍,则必须用数据补齐。200 自然是 4 的整数倍,不需要补齐,而 343 不是,所以 343
必须补充到 344 才可以。所以实际位图的大小是 344*260+1078,这就和大小吻合了。这
个图片每行补 1 个字节,而最多是要补 3 个字节。所以 341*260 图片和 343*260 图片,在
大小上没什么区别。
BMP
位图格式详解
位图格式
BMP
是
bitmap
的缩写形式,
bitmap
顾名思义,就是位图也即
Windows
位图。
它一般由
4
部分组成:文件头信息块、图像描述信息块、颜色表(在真彩色模式无颜色
表)和图像数据区组成。在系统中以
BMP
为扩展名保存。
打开
Windows
的画图程序,在保存图像时,可以看到三个选项:
2
色位图(黑白)、
16
色
位图、
256
色位图和
24
位位图。
现在讲解
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
(
32
位位图的透明度值,一般不需要)。即首先
4
字节表示颜色号
0
的
颜色,接下来表示颜色号
1
的颜色,依此类推。
4.
图像数据区
颜色表接下来位是位图文件的图像数据区,在此部分记录着每点像素对应的颜色号,其记
录方式也随颜色模式而定,既
2
色图像每点占
1
位;
16
色图像每点占
4
位;
256
色图像每
点占
8
位;真彩色图像每点占
24
位。所以,整个数据区的大小也会随之变化。究其规律而
言,可的出如下计算公式:图像数据信息大小
=
(图像宽度
*
图像高度
*
记录像素的位
数)
/8
。 然而,未压缩的图像信息区的大小。除了真彩色模式外,其余的均大于或等于数
据信息的大小。这是为什么呢?原因有两个:
1. BMP
文件记录一行图像是以字节为单位的。因此,就不存在一个字节中的数据位信
息表示的点在不同的两行中。也就是说,设显示模式位
16
色,在每个字节分配两个点信息
时,如果图像的宽度位奇数,那么最后一个像素点的信息将独占一个字节,这个字节的后
4
位将没有意义。接下来的一个字节将开始记录下一行的信息。
2.
为了显示的方便,除了真彩色外,其他的每中颜色模式的行字节数要用数据“
00”
补
齐为
4
的整数倍。如果显示模式为
16
色,当图像宽为
19
时,存储时每行则要补充
4-
(19/2+1)%4=2
个字节(加
1
是因为里面有一个像素点要独占了一字节)。如果显示模式为
256
色,当图像宽为
19
时,每行也要补充
4-19%4=1
个字节。
bmp
文件大体上分成四个部分。
位图文件头
BITMAPFILEHEADER
、位图信息头
BITMAPINFOHEADER
、调色板
Palette
、实际的位图数据
ImageDate
第一部分为位图文件头
BITMAPFILEHEADER
,是一个结构,其定义如下:
typedef unsigned char BYTE
typedef unsigned short WORD
typedef unsigned long DWORD
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //
类型名,必须是
0x424D
,即字符串“
BM”
,
DWORD bfSize; //
文件大小
WORD bfReserved1; //
保留字,不考虑
WORD bfReserved2; //
保留字,同上
DWORD bfOffBits; //
实际位图数据的偏移字节数,即前三个部分长度之和
} BITMAPFILEHEADER;
第二部分为位图信息头
BITMAPINFOHEADER
,也是一个结构,其定义如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //
指定此结构体的长度,为
40
LONG biWidth; //
位图宽
LONG biHeight; //
位图高
WORD biPlanes; //
平面数,为
1
WORD biBitCount //
采用颜色位数,可以是
1
,
2
,
4
,
8
,
16
,
24
,新的可以是
32
DWORD biCompression; //
压缩方式,可以是
0
,
1
,
2
,其中
0
表示不压缩
DWORD biSizeImage; //
实际位图数据占用的字节数
LONG biXPelsPerMeter; //X
方向分辨率
LONG biYPelsPerMeter; //Y
方向分辨率
DWORD biClrUsed; //
使用的颜色数,如果为
0
,则表示默认值
(2^
颜色位数
)
DWORD biClrImportant; //
重要颜色数,如果为
0
,则表示所有颜色都是重要的
} BITMAPINFOHEADER;
第三部分为调色板
Palette
,当然,这里是对那些需要调色板的位图文件而言的。
24
位和
32
位是不需要调色板的。
typedef struct tagRGBQUAD {
BYTE rgbBlue; //
该颜色的蓝色分量
BYTE rgbGreen; //
该颜色的绿色分量
BYTE rgbRed; //
该颜色的红色分量
BYTE rgbReserved; //
保留值
} RGBQUAD;
第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就是该象素颜在调色
板中的索引值。对于真彩色图,图象数据就是实际的
R
、
G
、
B
值。对于
2
色位图,用
1
位
就可以表示该象素的颜色
(
一般
0
表示黑,
1
表示白
)
,所以一个字节可以表示
8
个象素。对
于
16
色位图,用
4
位可以表示一个象素的颜色,所以一个字节可以表示
2
个象素。对于
256
色位图,一个字节刚好可以表示
1
个象素。对于真彩色图,三个字节才能表示
1
个象
素。要注意两点:
(1)
每一行的字节数必须是
4
的整倍数,如果不是,则需要补齐。
(2)
一般来说,
.bMP
文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图
象最下面一行的左边第一个象素,然后是左边第二个象素……接下来是倒数第二行左边第
一个象素,左边第二个象素……依次类推 ,最后得到的是最上面一行的最右一个象素。
16
色系统调色板
:
0 = RGB( 0, 0, 0) = 0x00000000;
1 = RGB(128, 0, 0) = 0x00000080;
2 = RGB( 0,128, 0) = 0x00008000;
3 = RGB(128,128, 0) = 0x00008080;
4 = RGB( 0, 0,128) = 0x00800000;
5 = RGB(128, 0,128) = 0x00800080;
6 = RGB( 0,128,128) = 0x00808000;
7 = RGB(128,128,128) = 0x00808080;
8 = RGB(192,192,192) = 0x00c0c0c0;
9 = RGB(255, 0, 0) = 0x000000ff;
10 = RGB( 0,255, 0) = 0x0000ff00;
11 = RGB(255,255, 0) = 0x0000ffff;
12 = RGB( 0, 0,255) = 0x00ff0000;
13 = RGB(255, 0,255) = 0x00ff00ff;
14 = RGB( 0,255,255) = 0x00ffff00;
15 = RGB(255,255,255) = 0x00ffffff;
图像数据起始:
000A-000D
图像数据大小:
0022-0025
图像信息大小:
000E-0011
图像宽度:
0012-0015
剩余10页未读,继续阅读
资源评论
qingshumm
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功