鼠标指针文件格式解析

您所在的位置:网站首页 鼠标点击超链接样式 鼠标指针文件格式解析

鼠标指针文件格式解析

#鼠标指针文件格式解析| 来源: 网络整理| 查看: 265

鼠标指针文件格式解析

文章目录 鼠标指针文件格式解析windowsico文件格式分析文件头:图像数据头段:图像数据段: Ani动态光标格式解析数据结构:'anih''seq '**'rate'**'LIST' cur静态光标文件格式解析 macOSLinux

windows ico文件格式分析

是一种图标文件,文件后缀名一般位icon或者ico

文件格式:文件头,图像数据头,图像数据两部分

文件头:

6字节

type ICONDIR = packed record idReserved: SmallInt; // Reserved 保留位,必须为0 idType: SmallInt; // Resource type 光标资源类型,作为ico时值为1,作为cur时值为2 idCount: SmallInt; // Image Count 标记了文件中包含的图像数量 end; // 6 bytes 图像数据头段:

紧接着文件头的就是图像数据头段了,它存放着文件中每个图像宽度、高度、颜色数量、数据段的偏移等信息,大小为16 * idCount。它是一个数组,每项数据16字节,定义如下:

type ICONDIRENTRY = packed record bWidth: Byte; // Width of the image 图像宽 bHeight: Byte; // Height of the image (2 * Height) 图像高 bColorCount: Byte; // Number of colors in image (0 when >= 8 bpp) 图像颜色数 bReserved: Byte; // Reserved 保留位数 wPlanes: SmallInt; // Color Planes (-> xHotspot [Cursor]) X坐标热点,与Y同为0时代表左上角 wBitCount: SmallInt; // Bits per pixel (-> yHotspot [Cursor]) Y坐标热点 dwBytesInRes: Integer; // How many bytes in this resource? 数据大小 dwImageOffset: Integer; // Where in the file is this image? 数据偏移量 end; // 16 bytes

读取完图像数据头段后,就可以知道文件中每个图标的大小,颜色位数了,同时直接根据数据段的偏移,读取图像数据段。图像数据的偏移是从文件最开始算起的。

图像数据段:

图像数据为多个图像的DIB数据,根据数据头段的偏移来定位。定位后,读取BIH信息。从BIH信息中,判断颜色位数大于8位的,记取XOR调色盘数据(小于8位的不存在XOR调色盘,只包含有一个MASK调色盘)。读取完XOR调色盘后,初始化图像DIB头,然后在文件中读取DIB数据。

存疑,没懂,先放着

最后又变成分析bmp文件了,像素值是原始数据

Ani动态光标格式解析

Ani动态光标格式解析 - 孤影对酌 - 博客园 (cnblogs.com)

文件类型关系:

bmp ∈ (ico == cur ) ∈ ani

数据结构:

ani文件结构在010里并没有直接的模板,而是以RIFF为开头标志位的文件,因此也可以使用RIFF模板来分析

本文是在孤影对酌师傅的文章基础上进行了一些备注,以供自己学习和分析

Ani文件中的数据是按区段存放的,区段数据结构如下:

标识符(4字节ASCII),数据长度(一个DWORD),数据

按照此规则来看Ani文件,文件起始12字节(12字节指以下标识符、数据长度和ACON三个部分)可以理解为标准文件头,除数据长度外,其余两个字段不会改变:

0x0000 52 49 46 46 标识符'RIFF' 0x0004 40 4D 00 00 数据长度,指整个文件的大小 0x0008 41 43 4F 4E 'ACON'

标准头之后,就是各个区段了,在孤影对酌师傅的探索中共发现了:‘anih’, ‘rate’, 'seq ', 'LIST’4种区段('seq '区段标识最后一个字符是空格,共4个字符)。

‘anih’

此区段数据长度恒为36,每4字节为一组,另外,数据长度36加上块大小4和名称4共44,里面存储的是一个结构体:

struct _anih { DWORD dwHeaderSize; //结构体大小,恒为36 DWORD dwNumFrames; //图像帧数,代表转为gif有多少帧,且该数与LISTchunk数量相等 DWORD dwNumSteps; //播放帧数,当'seq '存在时可能大于dwNumFrames DWORD dwWidth; //图像宽度 DWORD dwHeight; //图像高度 DWORD dwBitCount; //色彩位数 DWORD dwNumPlanes; //设备平面数 DWORD dwDisplayRate; //显示频率(Time Delay,单位为1/60秒) DWORD dwFlags; //标志 };

dwFlags的第0位为1时,表示图像帧数据格式为Icon或Cursor,为0表示图像帧数据为位图raw数据,使用_anih结构中的尺寸、色彩深度等信息。

第1位解释为bool型,表示文件是否含有’seq '段。

'seq ’

010显示顺序位**先rate后seq **

此区段为可选段(不一定存在),段内的数据为一个DWORD数组,长度为 “区段数据长度” / sizeof(DWORD)。

0x0000 73 65 71 20 标识符'seq ' 0x0004 24 00 00 00 数据长度 0x0008 00 00 00 00 数组元素[0],值为0表示此处显示第0帧图像 0x000C 01 00 00 00 数组元素[1],值为1表示第一帧图像 0x0010 02 00 00 00 [2],第2帧 0x0014 03 00 00 00 [3],第3帧 0x0018 00 00 00 00 [4],第0帧 0x001C 04 00 00 00 ... 0x0020 05 00 00 00 0x0024 01 00 00 00 0x0028 00 00 00 00

此区段存储的是播放顺序,当Ani文件播放时,按照DWORD数组下标递增,依次从此数组中取出图像帧号,再到存储图像帧数据的’LIST’段中获取对应的图像帧进行显示。所以在一次播放中,同一个图像帧可以出现多次。_anih结构中的dwNumSteps即为播放起始数组下标。

此区段不存在时,'LIST’中图像帧的顺序即为播放顺序,_anih结构中的dwNumSteps为播放起始帧号。

‘rate’

此区段为可选段,段内数据为一个DWORD数组,长度为 “区段数据长度” / sizeof(DWORD)。

表示每一帧的播放速率,gif的每一帧都是匀速播放的,rate的存在代表这个播放的速率不一定相同

0x0000 72 61 74 65 标识符'rate' 0x0004 24 00 00 00 数据长度 0x0008 0F 00 00 00 x 1/60秒 = Time Delay 0x000C 0F 00 00 00 0x0010 0F 00 00 00 0x0014 0F 00 00 00 0x0018 46 00 00 00 0x001C 0F 00 00 00 0x0020 0F 00 00 00 0x0024 0F 00 00 00 0x0028 0F 00 00 00

此区段内存储的为播放频率(Time Delay),同样以1/60秒为单位,当’seq '存在时,按相同下标与’seq '中的每个元素相对应,数组大小与’seq '相等。当’seq '不存在时,与’LIST’中图像帧相对应,数组大小等于_anih结构中的dwNumFrames。

‘LIST’

同样拥有12字节“标准头”,探索中发现,此区段内存储的数据有两种可能:

1.Ani文件的名称、作者

2.图像帧数据

当存储名称、作者信息时,格式为:

0x0000 4C 49 53 54 标识符'LIST',前12字节为“标准头” 0x0004 26 00 00 00 数据长度 0x0008 49 4E 46 4F 标识符'INFO'表示此列表为信息列表 0x000C 49 4E 41 4D 标识符'INAM'表示名称 0x0010 0C 00 00 00 数据长度 0x0014 68 65 61 72 74 73 74 69 63 6B 31 00 字符串'heartstick1' 0x0020 49 41 52 54 标识符'IART'表示作者 0x0024 06 00 00 00 数据长度 0x0028 68 75 61 6C 69 00 字符串'huali'

当存储图像帧数据时,格式为:

0x0000 4C 49 53 54 标识符'LIST',前12字节为“标准头” 0x0004 90 11 00 00 数据长度 0x0008 66 72 61 6D 标识符'fram'表明此列表为图像数据帧列表 0x000C 69 63 6F 6E 标识符'icon'标识图像数据帧数据区段 0x0010 BE 08 00 00 数据长度 0x0014 00 00 02 00 图像数据 ... ... 多帧图像

至此,数据结构解析完毕。

此时有一个疑问,在icon的图像数据中,数据块的大小和图片的大小和像素有什么关系呢?

此时的这个图像数据是一个cur的文件格式

我们可以按照ico图标文件来进行分析

cur静态光标文件格式解析

很好,这次是彻底没有模板可以借助了

让我们从零开始分析一个文档吧

看了出题人写的文章,了解到cur文件也是和ico文件同属一宗,但唯一不同的是有一个标志位表明这是一个cur文件

这个标志位是全文档的第三个字节 在这里插入图片描述

唯二一篇可以参考的文章

从Windows动态指针到MacOS动态指针——ANI2GIF - 哔哩哔哩 (bilibili.com)

CURSOR 文件格式解析_jinhaijian的博客-CSDN博客

全称为CURSOR

因此,剩下的部分可以按照ico图标文件进行分析

macOS

从Windows动态指针到MacOS动态指针—— 在Windows上制作指针 - 哔哩哔哩 (bilibili.com)

是xml的形式,后缀名为cape文件

结构如下:

{ 'Author': '', 'CapeName': '', 'CapeVersion': 1.0, 'Cloud': False, 'Cursors': { 'com.apple.coregraphics.Arrow': { 'FrameCount': 1, 'FrameDuration': 1.0, 'HotSpotX': 0.0, 'HotSpotY': 0.0, 'PointsHigh': 32.0, 'PointsWide': 32.0, 'Representations': [b''] } }, 'HiDPI': False, 'Identifier': 'local.error404.Unnamed.635739212.539397.A9D5CFB1-558B-46DD-95BB-3E8D6ED022D8.693110507.131993', 'MinimumVersion': 2.0, 'Version': 2.0 }

例子

Author 小蓝蓝 CapeName 蓝蓝的测试图标 CapeVersion 1.0 Cloud Cursors com.apple.coregraphics.Arrow FrameCount 34 #代表帧数 FrameDuration 0.1 HotSpotX #代表生效的点的位置 0.0 HotSpotY 0.0 PointsHigh 32.0 #代表图像大小,32*32 PointsWide 32.0 Representations base64转图片,图片类型为tiff com.apple.coregraphics.IBeam FrameCount 28 FrameDuration 0.1 HotSpotX 0.0 HotSpotY 0.0 PointsHigh 32.0 PointsWide 32.0 Representations base64转图片,图片类型为tiff com.apple.coregraphics.Move FrameCount 24 FrameDuration 0.1 HotSpotX 0.0 HotSpotY 0.0 PointsHigh 32.0 PointsWide 32.0 Representations base64转图片,图片类型为tiff com.apple.cursor.17 FrameCount 52 FrameDuration 0.1 HotSpotX 0.0 HotSpotY 0.0 PointsHigh 32.0 PointsWide 32.0 Representations base64转图片,图片类型为tiff com.apple.cursor.18 FrameCount 31 FrameDuration 0.1 HotSpotX 0.0 HotSpotY 0.0 PointsHigh 32.0 PointsWide 32.0 Representations base64转图片,图片类型为tiff HiDPI Identifier local.小蓝蓝.蓝蓝的测试图标.1673433937.428604.949CA744-8B80-4D9F-A8F6-7DA1877E517E.1673433937.428639 MinimumVersion 2.0 Version 2.0 Linux

文档好像很复杂捏

挖巨坑



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3