BroBordd/qmgd
GitHub: BroBordd/qmgd
从零构建的三星 Qmage 专有图像格式解码器,通过逆向工程实现对 .qmg 文件的帧级解码与导出。
Stars: 0 | Forks: 0
# qmgd
这是一个用于三星 Qmage (`.qmg`) 图像和开机动画格式的解码器(最终也会包含编码器)。该项目从零开始构建,通过对该格式进行逆向工程,并与真实的 FFmpeg 解码器补丁进行交叉验证。
Qmage 是一种专有的韩国图像编解码器(由 Quram 开发),三星将其用于开机/关机动画以及部分 UI 资源。目前没有官方的公开规范。本项目的解码器是 [Peter Ross 的 Qmage 解码器补丁](https://ffmpeg.org/pipermail/ffmpeg-devel/2024-November/336379.html)(于 2024 年 11 月提交给 FFmpeg)中格式逻辑的 C 语言移植版本,并已通过包括真实设备开机动画在内的实际样本文件进行了验证。
关于已确认实现与尚未实现的功能,请参阅 [`docs/FORMAT.md`](docs/FORMAT.md)。
## 状态
- **解码:可用。** 头部解析、两条 `W2_PASS` 编解码路径(纯色、简单调色板),以及两条 `V16_SHORT_INDEX` 编解码路径(关键帧 + 动画帧间)均已实现,并已与真实文件进行了逐像素的验证。
- **编码:尚未开始。** 目标是开发一款工具,能够接收普通图像(如 PNG 等)并生成有效的 `.qmg` 文件。这是下一步的工作。
- 尚未实现:alpha/透明通道,以及少数几种较罕见的头部标志组合。具体列表请参阅 `docs/FORMAT.md`。
## 构建
使用 CMake(推荐):
```
cmake -B build
cmake --build build
./build/qmgd_dump samples/output.qmg out
```
不使用 CMake:
```
sh build.sh
./qmgd_dump samples/output.qmg out
```
`qmgd_dump` 是一个诊断 CLI 工具:它会解码 `.qmg` 文件中的每一帧,并将每一帧输出为 `.ppm` 图像(`out_0.ppm`、`out_1.ppm`...),同时将每一帧解析出的头部字段打印到 stdout/stderr。PPM 是一种极其简单的未压缩格式——你可以使用 ImageMagick 进行转换(`convert out_0.ppm out_0.png`),或者直接用 GIMP 打开。
## 仓库结构
```
include/qmgd/ public headers (decode.h, bitreader.h)
src/ library implementation (header parsing, both codec paths)
tools/ qmgd_dump: CLI decode/dump tool built on top of the library
docs/ format notes
samples/ test .qmg files used during development
tests/ (reserved for automated tests -- not set up yet)
```
## 许可证
GPLv3(或更高版本)——详见 [`LICENSE`](LICENSE)。部分编解码逻辑源自 FFmpeg 采用 LGPL-2.1-or-later 许可证的 `qmagedec.c`/`qmagedata.h`,两者在许可证上是兼容的。
## 致谢
- Peter Ross,感谢其原始的 FFmpeg Qmage 解码器补丁,本项目的编解码逻辑正是基于此构建的。
- Google Project Zero / Mateusz Jurczyk,其 2020 年的 Qmage 安全研究(CVE-2020-8899)首次公开记录了该容器格式的存在,尽管这早于对完整像素编解码器的逆向工程。
标签:Bash脚本, C/C++, 事务性I/O, 云资产清单, 图像处理, 多媒体工具, 客户端加密, 编解码器, 逆向工程