位图结构
来源:互联网 发布:霍华德巅峰时期数据 编辑:程序博客网 时间:2024/06/10 00:38
位图文件由4个部分组成:位图文件头(BITMAPFILEHEADER)
位图信息头(BITMAPINFOHEADER)
调色板(LOGPALETE) (真彩图没有调色板)
实际位图数据
- 位图文件头结构(14字节)
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; //文件类型,值为0x4d42,即字符串BM
DWORD bfSize; //文件大小,即实际位图数据大小
WORD bfReserved1; //保留字
WORD bfReserved2; //保留字
DWORD bfOffBits; //从文件头到实际数据的偏移字节数,即位图文件头+位图信息头+调色板的大小
}BITMAPFILEHEADER; - 位图信息头结构(40字节)
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; //这个结构的大小,固定值40
LONG biWidth; //图像宽度,单位为像素
LONG biHeight; //图像高度,单位为像素
WORD biPlanes; //调色板的数量,必须为1
WORD biBitCount; //颜色使用的位数,1表示黑白二色,4表示16色,8表示256色,24表示真彩色
DWORD biCompression; //是否压缩,通常为BI_RGB,即不压缩
DWORD biSizeImage; //实际位图数据的大小
LONG biXPelsPerMeter;//目标设备的水平分辨率,单位为像素/米
LONG biYPelsPerMeter;//目标设备的垂直分辨率,单位为像素/米
DWORD biClrUsed; //指定图像实际用到的颜色数,如果为0,表示为2的bitBitCount次方种
DWORD biClrImportant; //重要的颜色数,为0表示都重要
}BITMAPINFOHEADER - 调色板是一种GDI对象,可以认为它是一个颜色数组,列举了图像用到的所有颜色。但是对真彩色位图来说,是没有调色板的。此时,在位图信息之后直接是位图的 实际数据。调色板结构为LOGPALLETE
typedef struct tagLOGPALETTE
{
WORD palVersion; //表示系统的版本号
WORD palNumEntries; //表示调色板中包含的项目数,每一个项目表示一个颜色
PALETTEENTRY palPalEntry[l]; //表示PALETTEENTRY数组中的第一个颜色,PALETTEENTRY定义了颜色信息 - PALETTEENTRY结构定义如下
typedef struct tagPALETTEENTRY
{
BYTE pcRed; //表示红色分量
BYTE pcGreen; //表示绿色分量
BYTE pcBlue; //表示蓝色分量
BYTE pcFlags; //表示调色板中的项目如何被使用,可以为NULL
}PALETTEENTRY
对于使用了调色板的位图,位图实际数据描述的是像素值在调色板中的索引值,如果没有使用调色板,位图实际数据就是实际的RGB颜色值。
对于真彩色位图来说,没有调色板,一个像素需要3个字节来表示,在对位图数据进行操作时应该注意以下问题:
1.位图数据每行的字节数必须是4的整数值
以真彩色位图为例,如果位图的宽度为150,由于一个像素需要3个字节,因此一行需要450个字节,但是450并不是4的整数倍,需 要填充2个字节,变为452,为4的整数倍。这样一行需要填充2个字节。正式基于这个原因,在旋转位图时会导致源位图与目标位图的大小不一致,以150*100大小的位图为例,旋转后的图像大小为100*150,尤其旋转后的宽度为100,每行需要300个字节,正好是4的整数倍,因此不再需要填充字节了,这样就导致转换后的位图比原来的位图小。
2.位图数据是从下向上存储的
对于位图数据来说,最低端的数据表示的是位图的第一行颜色数据。最上方的数据表示的是位图的最后一行颜色数据,每一行数据表示的颜色仍是按照从左向右存储的。
3.对于真彩色位图来说,每一行数据是按照RGB的颜色数序表示的
真彩色位图每一行数据表示的颜色都是按照蓝、绿、红顺序。
- 位图结构
- 位图结构
- 位图结构
- 位图结构
- 位图的结构
- [链接]位图文件结构
- 位图文件结构bmp
- 位图文件结构
- 位图文件结构
- 位图结构 Bitmap Storage
- BMP位图结构
- 位图索引结构
- BMP位图结构详解
- 位图结构解析
- 位图结构和基础知识
- windows 位图结构详解
- BMP位图结构
- CreateDIBSection及位图结构
- C++中函数调用时的三种参数传递方式
- 用数组实现堆栈 && 判断接收到的数据是否连续
- 三块空板换来的教训——引脚间距0.5mm的焊接方法
- Android 图形系统
- 堆和栈的区别
- 位图结构
- 如何编译google test的例子?
- Android Display System --- Surface Flinger
- 【Android游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)
- 体育参数检验方法
- Vim配置文件 v2010-01-16
- oracle 关于表语句
- 如何使用google test写单元测试?
- 网页消息提示框