FahadBinHussain/samsung-ifg-decoder
GitHub: FahadBinHussain/samsung-ifg-decoder
一款用于解码三星旧款功能机固件中 IFG/QMG/IFEG/IM/QM 等专有图像格式并将其转换为 BMP/PNG 的开源 Python 命令行工具。
Stars: 1 | Forks: 0
# samsung-ifg-decoder
[](https://github.com/FahadBinHussain/samsung-ifg-decoder/actions/workflows/ci.yml)
开源的 Samsung IFG / QMG / IFEG / IM / QM 图像解码器,用于旧款手机固件资源。
本项目解码旧款功能机固件中使用的部分 Samsung `.ifg` 和 `.qmg` 图像。当前版本支持类型为 `0x65000001`、`0x95000100` 和 `0x150001xx` 的 `IFEG` 图像,版本为 `0x5D` 的 `IM` 图像,以及已观测到的版本为 `0x0B` 的 `QM` 图像,包含在 Samsung B5722 固件中发现的许多图像资源。
## 状态
已支持:
- `IFEG` 魔数:`49 46 45 47`
- 类型:`0x65000001`
- 类型:`0x95000100`
- 类型族:`0x150001xx`
- `IM` 魔数:`49 4D`,版本字节 `0x5D`
- `QM` 魔数:`51 4D`,版本字节 `0x0B`,已观测到 A9LL、A9LL 动画、A9LL `use_extra_exception`、原始类型 `0x00` RGB565/无 alpha 通道的 A9LL,以及 W2 depth-2 流
- `--inspect` 会报告 `IM_0x5D` 近无损、alpha 平面和扩展头标志
- 在 QMG UI 条带中观测到的奇数像素计数 W2 资源
- 输出:24 位 `.bmp` 或 `.png`
- 针对已观测到的 `QM_0x0B_A9LL` 和 `QM_0x0B_W2` alpha 平面,支持可选的 RGBA `.png` 输出
- 为已观测到的 `QM_0x0B_A9LL` 动画导出完整的 RGB 帧
- 单文件解码
- 针对 `.ifg` 和 `.qmg` 的文件夹/批量解码
- 可选:将 `240x960` 待机壁纸切分为 `240x320` 面板
尚不支持:
- 已观测到的 A9LL 帧布局之外的其他 `QM` / QMG 版本和动画变体
- 真实的 `IM_0x5D` alpha 平面样本;目前尚未发现带有疑似 alpha 标志的 B5722 样本
- 将 BMP/JPG 重新编码回 IFG
## 环境要求
- Python 3.10 或更高版本
- 无需第三方 Python 包
## 合成测试数据
`samples/synthetic` 文件夹包含用于公共测试和演示的微型手工构建 `.hex` 数据。它们涵盖了具有代表性的 `IM_0x5D`、A9LL QMG 和 W2 QMG 路径,且无需重新分发 Samsung 固件或解码后的资源。
## 测试
运行合成回归测试套件:
```
python -m unittest discover -s tests
```
## 用法
解码单个文件:
```
python samsung_ifg_decoder.py input.ifg output.bmp
```
将单个文件解码为 PNG:
```
python samsung_ifg_decoder.py input.ifg output.png
```
解码包含 `.ifg` 和 `.qmg` 文件的文件夹:
```
python samsung_ifg_decoder.py input_folder output_folder
```
将文件夹解码为 PNG:
```
python samsung_ifg_decoder.py input_folder output_folder --format png
```
递归解码文件夹:
```
python samsung_ifg_decoder.py input_folder output_folder --recursive
```
在存在支持的 alpha 平面时写入 RGBA PNG:
```
python samsung_ifg_decoder.py input.ifg output.png --with-alpha
```
导出已观测到的 A9LL QMG 动画中的每一帧:
```
python samsung_ifg_decoder.py input.qmg output.png --extract-animation-frames
```
解码壁纸并将 `240x960` 待机图像切分为三个 `240x320` 面板:
```
python samsung_ifg_decoder.py input_folder output_folder --recursive --split-240x320-panels
```
写入 CSV 清单:
```
python samsung_ifg_decoder.py input_folder output_folder --recursive --manifest decode_manifest.csv
```
在不解码的情况下检查文件头:
```
python samsung_ifg_decoder.py input_folder --inspect --recursive --manifest inspect_manifest.csv
```
在不输出图像的情况下分析解码诊断信息:
```
python samsung_ifg_decoder.py input_folder --analyze --recursive --manifest analyze_manifest.csv
```
对于 A9LL QMG 文件,分析功能还会报告预期的控制、命令和原始流限制,并在当前流遍历超出切分点时发出警告。已观测到的 `use_extra_exception` A9LL 分支将使用其独立的原始/差分决策位路径进行解码和分析。
## 各文件说明
- `samsung_ifg_decoder.py` 是解码器和命令行工具。
- `codec_tables.json` 包含解码器使用的功能查找表。
- `docs/format-notes.md` 记录了当前已知的格式信息。
- `samples/README.md` 说明了为何不包含固件样本。
## B5722 壁纸结果示例
B5722 固件包含如下待机图像:
- `Master/a/images/idle/idle_011.ifg`
- `Master/a/images/idle/idle_021.ifg`
- ...
这些属于 `IFEG_65000001`,通常为 `240x960` 尺寸。使用 `--split-240x320-panels` 导出适合手机屏幕尺寸的面板。
## B5722 UI 资源示例
B5722 固件还包含许多 `IFEG_95000100`、`IFEG_150001xx`、`IM_0x5D` 和 `QM_0x0B` 图像,特别是微件、菜单、拨号盘和 UI 资源。它们可能是 `.ifg` 或 `.qmg` 文件,可使用相同的命令进行解码:
```
python samsung_ifg_decoder.py input.ifg output.png
```
## 安全与法律声明
本仓库不包含 Samsung 固件、专有壁纸、解码后的资源、恶意软件样本、原始 Samsung 代码或第三方转换工具二进制文件。
用户必须提供自己的 `.ifg` / `.qmg` 文件。本项目旨在用于旧款手机固件资源的留存、互操作性和个人恢复。
## 路线图
- 扩展 `QM` / QMG 版本覆盖范围,支持已观测到的 A9LL 帧记录之外的动画变体。
- 收集并解码真实的 `IM_0x5D` alpha 平面样本。
- 扩展可重新分发的合成测试数据覆盖范围,以涵盖更多边缘情况。
## 贡献者
标签:Python, 三星, 固件解析, 图像处理, 图像解码, 多媒体工具, 文件格式, 无后门, 逆向工具