RePKG 实战指南:拆开 Wallpaper Engine 的 PKG,把 TEX 纹理转成可编辑的 PNG
RePKG 实战指南:拆开 Wallpaper Engine 的 PKG,把 TEX 纹理转成可编辑的 PNG
【免费下载链接】repkgWallpaper engine PKG extractor/TEX to image converter项目地址: https://gitcode.com/gh_mirrors/re/repkg
RePKG 是一款用 C# 写成的命令行工具,专门解析 Wallpaper Engine 的 PKG 资源包,并把包内的 TEX 纹理转成 PNG 等通用图片格式。它面向壁纸创作者、素材收集者和想研究文件格式的开发者,全程只需在终端里敲命令,无需安装任何图形界面。
先从收藏夹里的一堆 .pkg 说起
很多人的 Steam 创意工坊目录下躺着这样的场景:workshop/content/431960里按编号排了几十个文件夹,每个文件夹里是scene.pkg、project.json、preview.jpg。壁纸在 Wallpaper Engine 里跑得好好的,可你想把某张图的素材抠出来做二创,双击 .pkg 却打不开——它是 Valve 生态里少见的专有打包格式。
如果你同时遇到下面这些情况,RePKG 基本就是为你准备的:
- 想提取 .pkg 里的贴图、模型、音频,但找不到能解包的软件;
- 拿到 .tex 纹理,Photoshop 和画图工具都不认;
- 攒了一堆壁纸包,想知道每个包里到底装了什么、有多大;
- 想把 TEX 里的 GIF 动图还原成能直接播放的文件。
RePKG 的核心价值就一句话:把"打不开"变成"一条命令的事"。
它到底能帮你处理哪几类事情
| 能力 | 说明 | 对应命令 |
|---|---|---|
| 解包 PKG | 把资源包内的文件按原始目录结构释放到本地 | repkg extract xxx.pkg |
| 还原工程 | 连同 project.json、preview.jpg 一起拷出,恢复可用的壁纸工程 | repkg extract -c |
| TEX 转图 | 把 TEX 纹理解码成 PNG,动图还原成 GIF | repkg extract -t |
| 只取原文 | 保留 TEX 原始字节,不做任何转换 | repkg extract --no-tex-convert |
| 包体体检 | 列出包内文件清单、大小、排序、过滤 | repkg info -e -s -b size |
十分钟跑通:克隆、编译、验证
RePKG 没有发布现成的二进制安装包,拿到手需要自己编译一次,过程不长:
git clone https://gitcode.com/gh_mirrors/re/repkg cd repkg dotnet build RePKG.sln -c Release三点需要提前知道:
- 目标框架:CLI 工程面向 .NET Framework 4.7.2,两个类库是 netstandard2.0。Windows 上装好 .NET SDK 即可编译;Linux/macOS 上要编译 net472 目标,需要额外引入 .NET Framework 引用程序集(或借助 Mono),最省事的做法是在 Windows 上编译、全平台运行产物。
- 产物位置:编译完成后,可执行文件在
RePKG/bin/Release/net472/下,名字就是repkg(Windows 下为repkg.exe)。 - 验证安装:进入该目录执行
repkg --version,能看到版本号0.2.2即表示成功。
建议顺手把可执行文件目录加进 PATH,省得每次敲全路径:
# Windows PowerShell $env:Path += ";$PWD\RePKG\bin\Release\net472"# Linux / macOS export PATH="$PATH:$(pwd)/RePKG/bin/Release/net472"extract 命令的每一颗"旋钮"
extract是主力命令,既能解包也能转图,具体行为由下面这些选项决定:
| 参数 | 作用 | 例子 |
|---|---|---|
-o, --output | 输出目录,默认是当前目录下的./output | -o ./out |
-e, --onlyexts | 只提取指定扩展名的条目,逗号分隔 | -e "tex,png" |
-i, --ignoreexts | 跳过指定扩展名,逗号分隔 | -i "model,mp3" |
-t, --tex | 把输入目录下的全部 .tex 转成图片 | -t ./tex_dir |
-s, --singledir | 所有文件平铺到一个目录,不保留包内路径 | -s |
-r, --recursive | 递归搜索子目录里的 .pkg / .tex | -r |
-c, --copyproject | 顺带拷贝 pkg 旁边的 project.json 与 preview.jpg | -c |
-n, --usename | 用 project.json 里的标题做输出子目录名,而不是编号 | -n |
--no-tex-convert | 只提取原始文件,跳过 TEX 转图 | --no-tex-convert |
--overwrite | 覆盖已存在的输出文件(默认跳过并提示) | --overwrite |
几个容易忽略的细节:
- 解包时若条目是 TEX,默认会自动转成 PNG,并在旁边生成一份
.tex-json信息文件(宽高、格式、mipmap 数量等),不需要额外操作; -n依赖 pkg 同目录下的 project.json,如果文件缺失就退回用编号命名;- 目录作为输入时,
extract默认只处理直接子目录里的 pkg,要扫更深层级的目录必须加-r。
info 命令:给资源包做一次"体检"
info适合在动手提取前先摸清底细:
| 参数 | 作用 |
|---|---|
-e, --printentries | 打印包内每个文件的路径和字节数 |
-s, --sort | 开启排序(与-b搭配) |
-b, --sortby | 排序依据:name、extension、size,默认 name |
-p, --projectinfo | 只输出 project.json 里指定的字段,逗号分隔,*表示全部 |
--title-filter | 按壁纸标题关键字过滤,只显示匹配的包 |
# 看某个包里都有什么,按体积从大到小排 repkg info -e -s -b size "scene.pkg" # 把 project.json 的字段全部倒出来 repkg info -p "*" "scene.pkg" # 在一堆壁纸里找出标题含 rain 的 repkg info --title-filter "rain" E:\workshop\content\431960需要提醒的是,info的-t(查看目录下所有 TEX 信息)目前在源码里还是占位实现,TEX 的信息主要靠 extract 时生成的.tex-json文件来读,别在这上面浪费时间。
三个拿来就能用的实战场景
场景一:单张壁纸素材抢救
在创意工坊文件夹里找到心仪的壁纸,把它完整拆出来,包括工程配置和预览图:
repkg extract -c -o ./my_wallpaper "E:\workshop\content\431960\123456789\scene.pkg"完成后my_wallpaper里会有 project.json、preview.jpg、拆出来的贴图,以及每张贴图对应的 PNG 和.tex-json,相当于把壁纸还原成了一个可再次编辑的工程目录。
场景二:整库批量转 PNG
把收藏夹里所有壁纸的 TEX 纹理一次性抽成 PNG,平铺进一个目录,方便统一管理:
repkg extract -e tex -s -r -o ./png_out "E:\workshop\content\431960"-e tex只碰纹理、-s去掉包内层级、-r递归扫子目录,三步组合下来,输出目录里就是干干净净的一堆*.png。
场景三:只想验证"这包值不值得下"
先体检再解包,避免白白占硬盘:
repkg info -e -s -b size "suspicious.pkg" repkg info -p "title,type" "suspicious.pkg"第一条看包内有什么、体积分布如何,第二条看标题和类型,两秒钟就能判断要不要继续。
踩坑记录:常见报错与对策
| 现象 | 原因 | 处理办法 |
|---|---|---|
提示Input file not found | 路径写错,或文件不存在 | 检查路径与扩展名,pkg/tex 均可作为输入 |
提示Unrecognized file extension | 传入了 pkg/tex 以外的文件 | RePKG 只认这两种格式,先确认文件类型 |
| 转出的图是黑图或尺寸不对 | TEX 用了较冷门的压缩变体,或 mipmap 裁剪逻辑对不上 | 先用--no-tex-convert拿原始 tex,再用-t单独转换;仍失败可到项目 Issues 反馈 |
| 输出目录里很多文件被跳过 | 默认不覆盖已存在文件 | 需要强制更新时加--overwrite |
| GIF 动图还原后帧序错乱 | 部分包帧信息特殊,旋转/裁剪推算有偏差 | 属于已知的格式兼容问题,保留原始 tex 以便后续重转 |
| 大批量处理很慢 | 每个 pkg 都要读入内存再写盘 | 用-e过滤 +-s平铺,减少 IO 次数 |
背后发生了什么:从魔数到像素
理解原理能帮你判断"这个报错要不要管"。RePKG 对两种格式做了逆向:
PKG 文件以魔数PKG!(十六进制0x504B4721)开头,之后是条目表,每条记录保存路径、长度等信息,正文可能经过 LZ4 压缩(源码里引用了K4os.Compression.LZ4)。解包就是"读魔数 → 解析条目表 → 按需解压 → 落盘"。
TEX 纹理的结构更讲究,文件里依次是:
TEXV0005与TEXI0001两个魔数,用来声明版本与类型;- 头部(TexHeader),记录宽高、标志位(是否 ClampUV、是否为 GIF 动图等);
- 图像容器(ImagesContainer),里面是若干 mipmap 层级;
- 帧信息容器(FrameInfoContainer),动图专用,保存每帧的位置、尺寸、旋转角与帧间隔。
TEX 内部常用的像素格式有RGBA8888、DXT1、DXT3、DXT5、RG88、R8六种。DXT 系列是压缩格式,直接拿来当图片字节流是花的,需要先解码成 RGBA——这段解码算法移植自开源库 LibSquish,这也是项目仓库里THIRD-PARTY-NOTICES.txt存在的原因。
转换流程大致是:取第一张图的 mipmap → 若是压缩格式先解压 → 按头部的目标宽高裁剪 → 存成 PNG;动图则遍历帧信息,逐帧裁剪、旋转、设置帧延迟后拼回 GIF。
源码地图:三层各管一摊
项目按职责拆成三个工程,阅读源码时可以顺着这条线走:
| 工程 | 定位 | 关键内容 |
|---|---|---|
| RePKG.Core | 模型与接口 | ITex / ITexHeader / ITexImage 等接口,TexFormat、TexFlags、MipmapFormat 等枚举 |
| RePKG.Application | 实现层 | PackageReader/PackageWriter、TexReader、各 Writer、DXT/RG88 解码助手、TexToImageConverter |
| RePKG | 命令行入口 | Program.cs 解析参数,Extract.cs 与 Info.cs 分别实现两个子命令 |
命令行的入口在Program.cs,它用 CommandLineParser 注册了extract和info两个 verb;另外还藏了一个彩蛋——用repkg interactive可以进入交互模式,逐行输入命令,适合边摸索边试参数。
从使用者到贡献者:进阶路线
想把这套工具用到更顺,可以按下面的路线走:
- 先吃透命令:在终端执行
repkg --help、repkg help extract、repkg help info,配合 README 里的 Examples 逐个跑一遍; - 读懂数据流:从
Program.cs追到Extract.cs的ExtractPkg,再进TexReader和TexToImageConverter,整个"读文件→解析→转图→落盘"的链路就通了; - 挑一个方向动手:
- 补全
info命令里 TEX 信息的占位实现(目前InfoTex是空的); - 增加更多 DXT 变体或新压缩格式的支持;
- 把交互模式做得更完整,或包一层图形界面;
- 优化大批量场景的内存占用与并发。
- 补全
仓库里的 LICENSE 与 THIRD-PARTY-NOTICES.txt 写明了许可与第三方依赖声明,做二次开发前先翻一翻这两份文件。
写在最后
RePKG 的价值在于把 Wallpaper Engine 的资源从"黑盒"变成"可读的普通文件"。它解决的是格式壁垒问题,至于素材本身,请记住订阅者协议:提取出来的内容建议只用于个人学习、素材参考或获得授权后的二次创作,商用前务必确认原作者的授权条款。技术无边界,版权有红线——工具让你"做得到",而分寸感让你"用得久"。
【免费下载链接】repkgWallpaper engine PKG extractor/TEX to image converter项目地址: https://gitcode.com/gh_mirrors/re/repkg
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
