Catsystem2的hg3图像封回

逆向工程 实用技术 算法Catsystem2图像封回
浏览数 - 92发布于 - 2025-12-16 - 11:28

重新编辑于 - 2025-12-16 - 11:36

chinesize/CatSystem2/exthg3 at master · regomne/chinesize

image.png具体如何使用类似于命令行工具,不过要自行编译,有源码应该很好解决

基本测试了草帽的静态CG,动态暂未测试,类似的游戏基本通用

不过找这个确实转了一圈

顺带一提嘴如何将补丁重新注入回游戏内

Catsystem的int补丁用garbro打包后

改名为update00或update04-update99

编译时go语言依赖需要梯子开全局才可下载

ext.go做了什么

1. HG3文件结构:

  • 头部:包含魔数"HG-3"、头部大小和未知信息

  • 图像块:每个HG3文件包含多个图像块,每个块有唯一的ImageID

  • 节段:每个图像块包含多个节段,如stdinfo(基本信息)和多个img000XX(图像数据)

2. 关键数据结构:

  • HG3Header:文件头

  • SecStdinfo:图像基本信息(宽度、高度、位深度等)

  • SecImg:图像数据段信息

  • secRecordblockRecord:用于记录解析后的信息

3. 解包流程(extractHG3函数):

  1. 读取HG3文件头部验证格式

  2. 循环读取每个图像块

  3. 对每个图像块:

    • 读取stdinfo节段获取图像基本信息

    • 读取各个img000XX节段的压缩图像数据

    • 解压缩并解码图像数据

    • 保存为PNG文件

4. 图像解码过程:

extractAnImage函数:

  1. zlib解压缩图像数据和控制数据
  2. 使用unRLE进行游程编码解码
  3. 使用unDeltaFilter进行delta滤波反转
  4. 转换为PNG格式

5. 关键算法:

  • Delta滤波:使用unDeltaFilter函数还原差分编码的图像数据

  • 游程编码(RLE):使用unRLE函数解码压缩数据

  • 位解包unpackVal函数处理特殊的位转换

6. 支持的图像格式:

  • 32位RGBA图像(带透明度)

  • 24位RGB图像

7. 输出内容:

  • 将每个图像块解压为PNG文件

  • 生成info.json文件记录HG3文件的结构信息

8. 命令行接口:

bash

text
# 解包HG3文件
program -e -i input.hg3 [-o output_dir]

# 打包功能(代码中未实现)
# program -p -i input_dir [-o output.hg3]

9. 代码特点:

  • 使用Go的标准库和第三方bstream进行位流处理

  • 支持大端/小端字节序处理

  • 有错误处理和完整性检查

  • 结构化的JSON输出便于调试

pack.go做了什么

1. 图像编码流程:

readImageToBuff函数:

  1. 读取PNG图像并解码
  2. 获取DIB数据(getDibFromImage)
  3. 差分编码(diffImage)
  4. RGBA格式转换(rgbaCvt)
  5. 游程编码压缩(doRLE)
  6. zlib压缩(doZlib)

2. 关键编码函数:

getDibFromImage

  • 将PNG图像转换为DIB格式(设备无关位图)

  • 支持32位RGBA和24位RGB

  • 图像垂直翻转(HG3格式的Y轴方向与标准相反)

diffImage

  • 差分编码的逆运算(与解包时的unDeltaFilter相反)

  • 先垂直差分(从下到上),再水平差分(从右到左)

  • 这是HG3格式的核心压缩算法之一

rgbaCvt

  • 颜色分量的重组(与解包时的处理相反)

  • 将32位RGBA数据重新排列为4个独立的位平面

  • 使用queryTable函数进行位重排

doRLE

  • 游程编码压缩

  • 使用writeBitLen函数写入长度信息

  • 生成控制位流和数据流

3. 打包流程:

packImagesToHG3主函数:

  1. 读取解包时生成的info.json文件
  2. 创建HG3文件并写入头部
  3. 遍历所有blockRecord,逐个生成图像块
  4. 写入对齐填充数据(8字节对齐)

genBlockWithImage

  • 根据JSON描述重构一个图像块

  • 处理stdinfo节段和多个img000XX节段

  • 对于图像节段,读取对应的PNG文件并编码

  • 对于其他节段(如img_jpg),从base64解码原始数据

4. 数据结构对应关系:

readImageToBuff返回的数据:

go

text
newImgInfo SecImg   // 更新后的图像信息(包含压缩后的长度)
out []byte          // 压缩后的数据(zlib压缩的图像+控制数据)

writeBitLen的编码规则:

  • 使用二进制前缀编码表示长度

  • 例如:长度5编码为1 01(1个前导0 + 二进制101)

  • 这种编码方式可以高效地表示各种长度的数据

5. 技术细节:

颜色转换:

  • packVal:将8位颜色值转换为编码格式

  • queryTable:将32位RGBA值分解为4个字节

对齐要求:

  • HG3格式要求数据按8字节对齐

  • writeBlocks函数中添加填充字节

6. 数据依赖:

  • 依赖于解包时生成的info.json文件

  • PNG文件命名规则:{前缀}_{块ID}_{节段索引}.png

  • 使用base64编码保存非图像数据

7. 完整的工作流程:

  1. 解包:HG3 → PNG + info.json
  2. 编辑:修改PNG图像
  3. 打包:PNG + info.json → HG3

8. 关键算法说明:

差分编码(Delta Encoding):

text

text
原始算法:像素值 = 当前像素值 + 左方像素值 + 上方像素值
解码时:需要顺序计算
编码时:需要逆序差分

游程编码(RLE):

  • 交替使用复制和跳过模式

  • 使用位流编码长度信息

本文版权遵循 CC BY-NC 协议 本站版权政策

(。>︿<。) 已经一滴回复都不剩了哦~