如何用GARbro批量转换pimg文件

请求帮助游戏解包
浏览数 - 193发布于 - 2025-09-25 - 17:56
aquber
aquber

188

我用krkrextract解包游戏想提取cg,然后得到一堆pimg文件,虽然可以用GARbro提取,但百多个只能一个个转换,更何况每一个pimg文件里的子文件命名还一样,还得反复重命名区分,实在是太麻烦了。有大佬能提供更快捷的办法吗

aquber-1758794113181-297png

4 条回复

鲲

5802

#1
发布于 2025-09-25 - 19:16 (编辑于 2025-09-25 - 19:17)
aquber
发布于 2025-09-26 - 22:31
回复 @鲲#1

<https://github.com/leohu1/PIMG-Decoder> 现场搜的,我也没用过,你可以试试 我一般只解包 CG 做壁纸,所以我直接拿一张完整的底图就可以,没有用合成

不是说要把一个pimg里的那些子文件的图合成一张,而是要批量提取多个pimg的图

鲲

5802

#3
发布于 2025-09-26 - 23:08
回复 @aquber#2

你把这个项目 clone 下来,然后把 main.py 中的 pimg_export_layers 函数改成下面这样就可以解包所有 pimg 图片了

python
def pimg_export_layers(pimg_path, image_format=".png"):
    img_path, json_path, resx_path = pimg_decode(pimg_path)
    output_prefix = "./output/{}" + image_format

    with open(json_path) as f:
        j = json.load(f)
    with open(resx_path) as f:
        jr = json.load(f)

    def layer_id2path(lid: str):
        return pimg_path.parent.joinpath(jr["Resources"][str(lid)])

    width = j["width"]
    height = j["height"]

    for i, layer in enumerate(j["layers"]):
        layer_id = layer["layer_id"]
        name = layer.get("name", f"layer_{i}")
        left, top = layer["left"], layer["top"]

        pm = Image.open(layer_id2path(layer_id))

        im = Image.new("RGBA", (width, height), (0, 0, 0, 0))
        im.paste(pm, (left, top), pm if pm.mode == "RGBA" else None)

        safe_name = name.replace("/", "_").replace("\\", "_")
        im.save(output_prefix.format(safe_name))
        pm.close()

    shutil.rmtree(img_path.with_suffix(""))
    json_path.unlink()
    resx_path.unlink()
2778995958
发布于 2025-09-27 - 14:24

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