梅露露的炼金工房解包物品图片

访问:https://github.com/CatClawed/pssg-g1t-extractor,下载里面的extractor.py文件

进入steamapps\common\Atelier Meruru ~The Apprentice of Arland~ DX\Res\x64\winxls目录,复制a13_itempicture.PSSG

新建一个目录,将a13_itempicture.PSSGextractor.py放在该目录下,执行python extractor.py a13_itempicture.PSSG,执行完毕之后会有一大堆g1t文件

访问https://github.com/VitaSmith/gust_tools,在右侧的Releases下载最新的gust_tools,然后解压缩,将解压出来的gust_g1t.exe拷贝到之前新建的目录里

然后在新建的目录中新建 extract.py 文件,内容如下

"""
整合脚本:g1t → 收集 DDS → 翻转并转为 PNG → 清理中间文件
用法:python script.py [前缀]
  例如:python script.py a13_item_
  若不提供参数,会交互式询问前缀(默认 a13_item_)
"""
import subprocess
import glob
import os
import sys
import shutil

import imageio.v3 as iio
import numpy as np

# ===== 配置(可按需修改) =====
GUST_EXE = "gust_g1t.exe"          # gust_g1t.exe 的路径(若不在 PATH 中请补全)
# =============================

def get_prefix():
    """获取处理前缀:命令行参数或交互输入"""
    if len(sys.argv) > 1:
        prefix = sys.argv[1]
        print(f"使用命令行指定的前缀: {prefix}")
    else:
        prefix = input("请输入目录前缀(默认 a13_item_): ").strip()
        if not prefix:
            prefix = "a13_item_"
            print(f"使用默认前缀: {prefix}")
    return prefix

def run_g1t_to_dds(prefix):
    """步骤1:调用 gust_g1t.exe 转换以指定前缀开头的 .g1t 文件"""
    pattern = f"{prefix}*.g1t"
    g1t_files = glob.glob(pattern)
    if not g1t_files:
        print(f"未找到匹配 '{pattern}' 的 .g1t 文件,跳过转换步骤。")
        return

    print(f"找到 {len(g1t_files)} 个 .g1t 文件,开始转换...")
    for g1t in g1t_files:
        print(f"  处理: {g1t}")
        subprocess.run(
            [GUST_EXE, g1t],
            stderr=subprocess.DEVNULL,
            check=False
        )
        print(f"  完成: {g1t}")
    print("g1t 转换结束。\n")

def collect_dds(prefix, dds_dir):
    """步骤2:将以 prefix 开头的目录中的 000.dds 复制到 dds_dir"""
    os.makedirs(dds_dir, exist_ok=True)
    # 匹配以 prefix 开头的目录
    dirs = [d for d in glob.glob(f"{prefix}*") if os.path.isdir(d)]

    # 排除 dds_dir 和 png_dir 自身(防止误收集)
    dirs = [d for d in dirs if os.path.basename(d) not in (os.path.basename(dds_dir), os.path.basename(png_dir))]

    if not dirs:
        print(f"未找到以 '{prefix}' 开头的目录(已排除中间/输出目录),跳过收集步骤。")
        return

    print(f"开始收集 DDS,目标目录:{dds_dir}")
    for d in dirs:
        src = os.path.join(d, "000.dds")
        if os.path.isfile(src):
            dst_name = os.path.basename(d) + ".dds"
            dst = os.path.join(dds_dir, dst_name)
            shutil.copy2(src, dst)
            print(f"  已复制: {src} -> {dst}")
        else:
            print(f"  警告: {d} 中未找到 000.dds,已跳过。")
    print("DDS 收集完成。\n")

def convert_dds_to_png(dds_dir, png_dir):
    """步骤3:将 dds_dir 下的所有 .dds 垂直翻转并保存为 .png 到 png_dir"""
    os.makedirs(png_dir, exist_ok=True)
    dds_files = glob.glob(os.path.join(dds_dir, "*.dds"))

    if not dds_files:
        print(f"在 {dds_dir} 中未找到 .dds 文件,跳过转换步骤。")
        return

    print(f"开始将 DDS 转为 PNG,输出目录:{png_dir}")
    for dds_path in dds_files:
        base = os.path.basename(dds_path)
        png_name = os.path.splitext(base)[0] + ".png"
        png_path = os.path.join(png_dir, png_name)

        img = iio.imread(dds_path)
        flipped = np.flipud(img)
        iio.imwrite(png_path, flipped)
        print(f"  已转换: {dds_path} -> {png_path}")
    print("PNG 转换完成。\n")

def cleanup_intermediates(prefix, dds_dir, png_dir):
    """清理中间产物:删除以 prefix 开头的目录(跳过 png_dir),以及 dds_dir"""
    # 删除以 prefix 开头的所有目录,但保留 png_dir
    for d in glob.glob(f"{prefix}*"):
        if os.path.isdir(d) and os.path.basename(d) != os.path.basename(png_dir):
            shutil.rmtree(d)
            print(f"  已删除目录: {d}")

    # 确保 dds_dir 也被删除(可能不匹配 prefix 或已经被上面删除,做兜底)
    if os.path.isdir(dds_dir):
        shutil.rmtree(dds_dir)
        print(f"  已删除目录: {dds_dir}")

    print("清理完成。")

if __name__ == "__main__":
    prefix = get_prefix()
    # 根据前缀动态生成中间和输出目录名(保持原命名规则)
    dds_dir = f"{prefix}dds"
    png_dir = f"{prefix}png"

    run_g1t_to_dds(prefix)
    collect_dds(prefix, dds_dir)
    convert_dds_to_png(dds_dir, png_dir)
    cleanup_intermediates(prefix, dds_dir, png_dir)

    print(f"\n全部处理完成!最终输出目录: {png_dir}")
    input("按 Enter 键退出...")

执行代码python extract.py a13_item_,就会生成一个a13_item_png文件夹,里面是我们所需要的物品图片
执行代码python extract.py a13_monspicture_,就会生成一个a13_monspicture_png文件夹,里面是我们所需要的怪物图片

posted @ 2026-05-17 21:29  hellozjf  阅读(5)  评论(0)    收藏  举报