BMP数据实例
来源:互联网 发布:动态血压仪数据怎么看 编辑:程序博客网 时间:2024/05/18 00:06
1.文件结构
位图文件数据存储结构(字节单位):
前14字节(BITMAPFILEHEADER 文件头数据结构)
详细结构参考上面文档。
之后40字节(BITMAPINFOHEADER 位图信息头数据结构)
详细结构参考上面文档。
之后 调色板数据
只有小于等于8位象素才需要调色板,
最后,位图数据
大小:象素宽 × 象素高 × 每象素字节数
注意:位图文件中的颜色格式与平时的颜色组织格式稍有不同,它的颜色格式是
蓝色 blue
绿色 green
红色 red
平时的是 Red,Greed,Blue
2. 例子附带说明
关于位图文件内部数据是怎么组织的?关键是看参数biBitCount的值,该参数只有5个可选值1、4、8、24、32。根据它们的选值情况,文件有3种组织格式,下面分别用例子说明:
公共部分:文件头
前面14个字节,
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; //必填“BM”或“0x4D42”
DWORD bfSize; //必填文件总的字节大小
WORD bfReserved1;//必填 0
WORD bfReserved2;//必填 0
DWORD bfOffBits; //必填,象素值开始位置到文件头位置的偏移量
} BITMAPFILEHEADER;
接着40个字节,
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; //必填 0x28
LONG biWidth; //必填象素宽
LONG biHeight; //必填象素高
WORD biPlanes; //必填 1
WORD biBitCount; //必填 1、4、8、24、32之一,该值很重要!
DWORD biCompression;//必填BI_RGB,BI_RGB8,BI_RLE4之一,一般是BI_RGB
DWORD biSizeImage; //可选填,值为象素信息的字节总数
LONG biXPelsPerMeter;//可选填,一般为C4 0E 00 00,也可填0
LONG biYPelsPerMeter; //可选填,同上
DWORD biClrUsed; //必填,一般为0,
DWORD biClrImportant;//必填,一般为0
} BITMAPINFOHEADER
不同的部分:象素值
根据biBitCount参数有以下3种情况
<!--[if !supportLists]-->(1) <!--[endif]-->有调色板(biBitCount参数值为1、4、8)
此时位图文件先跟一段调色板颜色数据,再跟象素的颜色索引信息数据;
<!--[if !supportLists]-->(2) <!--[endif]-->无调色板(biBitCount参数值为24)
此时直接跟一段象素数据,每个象素由3个字节表示颜色值,顺序BGR;
<!--[if !supportLists]-->(3) <!--[endif]-->无调色板(biBitCount参数值为32)
此时直接跟一段象素数据,每个象素由4个字节表示颜色值,顺序BGR;
例1;1位象素单色4×4位图,假设第1、3象素为黑色,其他都为白色,那么有下面的数据来表示该位图的象素颜色值
00 00 00 00 FF FF FF 00; 50 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00 00.
说明:前面8个字节,是调色板的值,单色只有黑色和白色两种,它们的RGB表示就是前面的8个字节。RGB(0,0,0)为黑色,RGB(255,255,255)为白色,
50 00 00 00表示第一行位图象素,这里只有前4位有效,其他位都是补位而已。5的二进制就是0101,它对应第一行的四个象素的颜色索引“黑白黑白”;
F0 00 00 00表示第二行的位图象素,这里也是前4位有效,F的二进制是1111,正好对应颜色索引“白白白白”;
其他行的象素颜色一样表示法。
注:这里单色,所以参数biBitCount为1,即1位表示一个象素,所以4×4的每行就只有4位来表示象素颜色就够了,但是,系统规定必须32位对齐,所以需要28位0来来补足。故这里的每行都用4个字节来表示,只是后面28位没有实际用处而已。
注意:每个调色板中的一种颜色,必须用4个字节表示(RGB绝对值)
注意:关于象素每行补位算法,到底要补多少位,这可以不用操心,用算法
int i = ((Bitmap.bmWidth *wBitCount+31)/32)*4*Bitmap.bmHeight 得到的i就是:描述位图象素颜色总的要用到的字节数。该字节数减去该行象素的字节数,就是补位的字节数。
调色板的颜色个数为2的biBitCount次幂,
例2:4位象素8色的4×4位图,假设第一行第一象素为绿色,第三象素为红色,第二象素为蓝色,底为黑色,则有下面的数据来表示该位图文件的颜色值
RGBQUAD pallete[16] = { (0x0, 0x0, 0x0, 0x0), (0xFF, 0xFF, 0xFF, 0x0), (0xFF,0x0,0x0,0x0), (0x0,0xFF,0x0,0x0),( 0x0,0x0,0xFF,0x0),( 0xFF,0xFF,0x0,0x0),( 0xFF,0x0,0xFF,0x0),
(0x0,0xFF,0xFF,0x0),( 0xFF,0x80,0x0,0x0),( 0xFF,0x0,0x80,0x0),( 0xFF,0x80,0x80,0x0),
(0xFF,0xFF,0x80,0x0),( 0x80,0x80,0x80,0x0),( 0x80,0x0,0x0,0x0),( 0x,0x80,0x0,0x0),
(0x0,0x0,0x80,0x0)};
这是调色板颜色值,后面要跟各个象素的颜色索引值,它们共同组成象素颜色值的表述
32 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00
第一行“32 40 00 00”分别表示“绿蓝红黑”后16位为补位;
其他行一样的理解。
例3:24位象素彩色的4×4位图,假设第一行第一象素为绿色,第三象素为红色,第二象素为蓝色,底为白色,则有下面的数据来表示该位图文件的颜色值
00 FF 00 FF 00 00 00 00 FF FF FF FF 00(标志换行)
FF FF FF FF FF FF FF FF FF FF FF FF 00
FF FF FF FF FF FF FF FF FF FF FF FF 00
FF FF FF FF FF FF FF FF FF FF FF FF 00
注意:24位象素的位图文件没有调色板,但是,它的每个象素也不是用4字节表示,而是用3字节表示,即没有那个颜色结构的保留字节。但是,这样就会出现每行字节不能16位对齐的问题,所以每行完了必须要有个行结束字节“00”,
例4:32位象素真彩色的4×4位图,假设第一行第一象素为绿色,第三象素为红色,第二象素为蓝色,底为白色,则有下面的数据来表示该位图文件的颜色值
00 FF 00 00 FF 00 00 00 00 00 FF 00 FF FF FF 00
FF FF FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00
FF FF FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00
FF FF FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00
32位象素的位图,也没有调色板,但是它的颜色值是用4字节来表示的,除了RGB值外,还有一个保留值,始终为0。
- BMP数据实例
- 图解Winhex解析BMP文件数据实例
- BMP文件格式实例分析
- BMP格式实例分析
- 实例-BMP文件格式详解
- 读取数据 创建BMP
- BMP文件数据解析
- 读取bmp图片数据
- BMP位图数据
- BMP文件格式及数据提取
- BMP数据转换为RGB565
- WinCE 获取BMP图片数据
- bmp图像的数据信息
- BMP数据转换为RGB565
- BMP数据转换为RGB565
- 【寒江雪】修改BMP图像数据
- bmp文件转jpg文件---获取bmp数据
- BMP图像加载实例(C语言)
- 时光荏苒,岁月如梭
- 走过四年-失眠的日子
- Torque脚本中的面向对象技术
- 【Firefox扩展】javascript的对话框
- Vmware下成功编译linux内核2.6
- BMP数据实例
- 天地本不全
- 这样轻浮吗?
- 数据库类(Access专用) 未测试
- the first hibernate~~~~
- 异构数据库中间件sequoia(c-jdbc)初体验(1.安装试运行)
- c/c++ 程序内存分配
- Shape数据加载(同时打开多个文件)
- 在tomcat中设置数据源时jdbc驱动存放的位置