·1 分钟阅读

纯 Python 解析 Figma .fig 二进制格式

逆向 Figma 的 .fig 二进制格式,用零依赖 Python 实现节点树、几何属性与样式的提取和渲染,含解析流程与代码。

Python逆向二进制解析渲染

纯 Python 解析 Figma .fig 二进制格式

.fig 是 Figma 的二进制导出格式。这个项目用纯 Python 逆向了它的格式,实现节点树、几何属性、样式的提取与渲染,全程零第三方依赖。

解析流程

flowchart LR
    FIG[.fig 文件] --> PARSE[Section 分节扫描]
    PARSE --> SEC9[定位 Section 9 数据块]
    SEC9 --> TREE[逐层解析节点树]
    TREE --> GEO[几何/样式提取]
    GEO --> RENDER[Pillow 渲染]

文件结构

figma-parser/
├── figma_parser.py     # 核心解析器(零依赖)
├── figma_renderer.py   # 渲染器(需 Pillow)
├── test_parser.py      # 解析器单元测试
├── test_renderer.py    # 渲染器单元测试
└── testdata/           # 真实 .fig 测试文件

从 Section 9 入手

.fig 内部分节(Section)结构,核心节点数据集中在 Section 9。逆向这个数据块是打开整个格式的钥匙——先还原字段布局,再逐层解析出完整节点树。

核心解析只依赖标准库 struct,按字节解析二进制字段:

import struct

def parse_node(buf, offset):
    # 按字段布局逐字节读取
    node_type, = struct.unpack_from('<I', buf, offset)
    # ... 还原长度前缀、类型标记、嵌套子节点
    return node

关键设计

设计点 说明
解析器零依赖 核心只依赖 struct,按字节解析
渲染器分离 Pillow 在可选层实现
测试驱动 用真实 .fig 文件做回归

逆向二进制格式的乐趣在于"从字节里抠出结构"——本质上是一场解谜:字段顺序、长度前缀、类型标记,都要从规律里推断出来。