chinesize/CatSystem2/exthg3 at master · regomne/chinesize
具体如何使用类似于命令行工具,不过要自行编译,有源码应该很好解决
基本测试了草帽的静态CG,动态暂未测试,类似的游戏基本通用
不过找这个确实转了一圈
顺带一提嘴如何将补丁重新注入回游戏内
Catsystem的int补丁用garbro打包后
改名为update00或update04-update99
编译时go语言依赖需要梯子开全局才可下载
ext.go做了什么
1. HG3文件结构:
-
头部:包含魔数"HG-3"、头部大小和未知信息
-
图像块:每个HG3文件包含多个图像块,每个块有唯一的ImageID
-
节段:每个图像块包含多个节段,如
stdinfo(基本信息)和多个img000XX(图像数据)
2. 关键数据结构:
-
HG3Header:文件头 -
SecStdinfo:图像基本信息(宽度、高度、位深度等) -
SecImg:图像数据段信息 -
secRecord和blockRecord:用于记录解析后的信息
3. 解包流程(extractHG3函数):
-
读取HG3文件头部验证格式
-
循环读取每个图像块
-
对每个图像块:
-
读取
stdinfo节段获取图像基本信息 -
读取各个
img000XX节段的压缩图像数据 -
解压缩并解码图像数据
-
保存为PNG文件
-
4. 图像解码过程:
extractAnImage函数:
- zlib解压缩图像数据和控制数据
- 使用unRLE进行游程编码解码
- 使用unDeltaFilter进行delta滤波反转
- 转换为PNG格式
5. 关键算法:
-
Delta滤波:使用
unDeltaFilter函数还原差分编码的图像数据 -
游程编码(RLE):使用
unRLE函数解码压缩数据 -
位解包:
unpackVal函数处理特殊的位转换
6. 支持的图像格式:
-
32位RGBA图像(带透明度)
-
24位RGB图像
7. 输出内容:
-
将每个图像块解压为PNG文件
-
生成
info.json文件记录HG3文件的结构信息
8. 命令行接口:
bash
# 解包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函数:
- 读取PNG图像并解码
- 获取DIB数据(getDibFromImage)
- 差分编码(diffImage)
- RGBA格式转换(rgbaCvt)
- 游程编码压缩(doRLE)
- zlib压缩(doZlib)
2. 关键编码函数:
getDibFromImage:
-
将PNG图像转换为DIB格式(设备无关位图)
-
支持32位RGBA和24位RGB
-
图像垂直翻转(HG3格式的Y轴方向与标准相反)
diffImage:
-
差分编码的逆运算(与解包时的
unDeltaFilter相反) -
先垂直差分(从下到上),再水平差分(从右到左)
-
这是HG3格式的核心压缩算法之一
rgbaCvt:
-
颜色分量的重组(与解包时的处理相反)
-
将32位RGBA数据重新排列为4个独立的位平面
-
使用
queryTable函数进行位重排
doRLE:
-
游程编码压缩
-
使用
writeBitLen函数写入长度信息 -
生成控制位流和数据流
3. 打包流程:
packImagesToHG3主函数:
- 读取解包时生成的
info.json文件 - 创建HG3文件并写入头部
- 遍历所有blockRecord,逐个生成图像块
- 写入对齐填充数据(8字节对齐)
genBlockWithImage:
-
根据JSON描述重构一个图像块
-
处理
stdinfo节段和多个img000XX节段 -
对于图像节段,读取对应的PNG文件并编码
-
对于其他节段(如
img_jpg),从base64解码原始数据
4. 数据结构对应关系:
readImageToBuff返回的数据:
go
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. 完整的工作流程:
- 解包:HG3 → PNG + info.json
- 编辑:修改PNG图像
- 打包:PNG + info.json → HG3
8. 关键算法说明:
差分编码(Delta Encoding):
text
原始算法:像素值 = 当前像素值 + 左方像素值 + 上方像素值
解码时:需要顺序计算
编码时:需要逆序差分
游程编码(RLE):
-
交替使用复制和跳过模式
-
使用位流编码长度信息