CURSOR 文件格式解析
Cursor文件是Windows专用的光标文件。Cursor格式是比较简单的,没有做压缩,在cursor文件中都是存在调色板的。
光标目录:
Cursor的文件头存放着光标目录(Cursor Directory), 他的数据段如下
Field name | Field type | Size (bits) |
保留(Reserved) | WORD | 16 |
类型 (Type) | WORD | 16 |
光标个数(count) | WORD | 16 |
光标目录信息 | BYTE | 不定 |
在window 中,我们可以成如下结构
typedef struct _cursordir
{
WORD cdreserved;
WORD cdtype;
WORD cdcount;
} CURSORDIR;
各数据段的定义
保留(Reserved):该字段保留,必须为0
类型 (Type):光标资源类型,必须为2
光标个数(count):指定光标文件中,光标的个数。微软的程序通常不根据不同的情境,使用其中的一个。这种情况在ICON中很常见。
光标目录信息:根据光标个数,有个光标都有自己的光标目录信息。
光标目录信息:
光标目录信息存放在光标目录之后。他的数据段如下
Field name | Field type | Size (bits) |
宽度(Width) | BYTE | 8 |
高度 (Height) | BYTE | 8 |
颜色数(ColorCount) | BYTE | 8 |
保留 | BYTE | 8 |
X坐标热点(x hotspot) | WORD | 16 |
Y坐标热点(y hotspot) | WORD | 16 |
数据大小(byte size) | DWORD | 32 |
数据偏移量(image offset) | DWORD | 32 |
在window 中,我们可以成如下结构
typedef struct _cursordirentry
{
BYTE bwidth;
BYTE bheight;
BYTE bcolorcount;
BYTE breserved;
WORD wxhotspot;
WORD wyhotspot;
DWORD lbytesinres;
DWORD dwimageoffset;
} CURSORDIRENTRY;
宽度(Width):指定光标宽度
高度 (Height):指定光标高度
颜色数(ColorCount):保留字段,必须为0
保留:保留字段,必须为0
X坐标热点(x hotspot):指定光标热点区的X左标
Y坐标热点(y hotspot) :指定光标热点区的Y左标
数据大小(byte size):指定该光标图像的大小
数据偏移量(image offset):指定该光标图像的偏移量,偏移量是从文件头开始计算的。
当光标文件中存在多个光标时,就会有多份的光标目录信息。根据每个光标目录信息去读取光标图像。
光标图像:
每个光标图像数据,右四部分数据构成,其字段如下:
Field name | Field type | Size (bits) |
位图信息头(bitmap header info) | BITMAPINFOHEADER | 40 |
调色板 ( palette ) | RGBQUAD | 不定 |
XOR颜色数据(Color XOR) | BYTE | 不定 |
AND数据(Color AND) | BYTE | 不定 |
位图信息头(bitmap header info): 指定图片信息,其中只有biBitCount和biSizeImage有效,biHeight是XOR和AND数据高度之和。biPlanes为1,其他为0。
调色板 ( palette ):调色板信息,调色板的大小是2的biBitCount次方,即1<<biBitCount。
XOR颜色数据:每个pixel占用bitBitCout位。其信息是对应调色板中的索引值
AND数据:每个pixel占用一个bit,指定是否透明,1透明,0不透明。
XOR颜色数据的大小是bwidth * bheight * biBitCount/8, 画图的时候要根据每个像素信息从调色板中取颜色值。再根据AND数据,判断是否透明