求助大佬们,八月社,あいりすミスティリア游戏,请问角色表情差分该怎么合成拼接啊

通过网盘分享的文件:爱丽丝一个角色表情差分和对应剧本.zip
链接: 百度网盘 请输入提取码 提取码: adve
我想整一个renpy的播放器,但是表情差分这块难倒我了,不知道怎么把表情差分和身体拼接,还有拼接好的角色在renpy屏幕的定位坐标问题,其他问题倒是不难。

顶一下

素材不错,那就解决(可能)一下表情差分的在Ren’Py中的对齐问题。
虽然没有Ren’Py的使用经验,简单检索了一下,根据文档[1],推荐尝试从Ren’Py的层叠式图像(layeredimage)或着精灵(sprite)获取解决方案。其他的问题建议从参考文档[1]的layeredimage或在对应社区获取帮助。

Ren’Py读取图像并加载到RAM之前会进行优化,将所有图像剪裁到非透明像素的包围框(bounding box)。 因此,在图像被正确预加载的前提下,创作者剪裁图像并不会提升性能或减少图像尺寸[1]

[1]欢迎来到Ren’Py的参考文档 — Ren’Py 中文文档

以下脚本适配Ren’Py的层叠式图像(layeredimage)方案,如果对脚本代码有问题或需要修改,推荐借助AI。

处理结果示例:

处理脚本的示例代码

安装python后,先执行python -m pip install opencv-python numpy或者pip install opencv-python numpy,然后把以下脚本代码保存成*.py文件或者直接解压压缩包获取。
注意输入文件路径不建议出现非西文字符(终端执行时的字符集支持有限,英文和数字以外的字符容易报错)。


以下为脚本文件的压缩包:
emo_face_match.zip (1.5 KB)

以下为emo_face_match.zip 中文件脚本的内容:

# python -m pip install opencv-python numpy
# 返回 face 图片在 full 图片中的左上角偏移 (x, y)
# 以透明像素扩充图像
# python emo_face_match.py
import cv2
import os
import numpy as np

def find_offset(full_path, face_path):
    """
    要求 face 图片是 full 图片中某个区域的精确裁剪(尺寸一致)
    """
    full = cv2.imread(full_path, cv2.IMREAD_COLOR)
    face = cv2.imread(face_path, cv2.IMREAD_COLOR)

    if full is None or face is None:
        raise FileNotFoundError("无法读取图片,请检查路径是否正确")

    result = cv2.matchTemplate(full, face, cv2.TM_CCOEFF_NORMED)
    _, max_val, _, max_loc = cv2.minMaxLoc(result)

    if max_val < 0.8:
        print("警告:匹配度{max_val}较低,请检查图片是否一致") # 规范上应该有,但如果实际结果符合预期,请忽略
    return max_loc  # (x, y) 即 face 左上角在 full 中的坐标

if __name__ == "__main__":
    # 交互式输入
    full_path = input("请输入大图路径: ").strip()
    face_path = input("请输入子图路径: ").strip()

    try:
        offset = find_offset(full_path, face_path)
        x, y = offset
        print(f"子图左上角在大图中的坐标: ({x}, {y})")

        # 构建日志内容
        log_dir = os.path.dirname(os.path.abspath(full_path))
        log_file = os.path.join(log_dir, "match_log.log")
        log_entry = f"{os.path.basename(face_path)}→{os.path.basename(full_path)}: ({x}, {y})\n"

        # 追加写入日志,如果希望每次运行都清空旧日志(而不是追加),可以将打开模式 "a"改为 "w"
        with open(log_file, "a", encoding="utf-8") as f:
            f.write(log_entry)
        print(f"日志已保存至: {log_file}")
        
        # 将小图以透明像素填充到大图尺寸,保留子图自身透明
        full_img = cv2.imread(full_path, cv2.IMREAD_COLOR)
        h, w = full_img.shape[:2]

        # 创建全透明 BGRA 画布
        canvas = np.zeros((h, w, 4), dtype=np.uint8)

        # 读取子图,保留原始通道(可能含alpha)
        face = cv2.imread(face_path, cv2.IMREAD_UNCHANGED)
        if face.shape[2] == 3:  # 如果没有alpha通道,添加一个全不透明alpha
            face = cv2.cvtColor(face, cv2.COLOR_BGR2BGRA)
            face[:, :, 3] = 255
        # 如果已经是4通道(BGRA),则直接使用,不做修改

        fh, fw = face.shape[:2]
        canvas[y:y+fh, x:x+fw] = face

        # 输出文件名:大图名_子图名.png
        base_full = os.path.splitext(os.path.basename(full_path))[0]
        base_face = os.path.splitext(os.path.basename(face_path))[0]
        out_name = f"{base_full}_{base_face}.png"
        out_path = os.path.join(os.path.dirname(os.path.abspath(full_path)), out_name)
        cv2.imwrite(out_path, canvas)
        print(f"填充后的子图已保存至: {out_path}")

    except Exception as e:
        print(f"发生错误: {e}")

  1. Ren’Py的参考文档 — Ren’Py 中文文档 ↩︎

这游戏不是有一个Renpy写的离线吗。这引擎数据量多了之后进去巨慢,用nw.js呗,秒加载,spine live2d 图片帧都支持,好几个renpy的离线我都用nw.js重构了

全都可在RenPy裡面處裡的東西,為何要把簡單的事複雜化?

差分(紙娃娃系統)的其中一項解法是層疊式圖像,新版手冊也是叫你用這個,但是你必須事先定義所有角色的所有參數。(如RenPy的文件頁面所示)
問題是是你一個遊戲裡面有多少角色?這可不是只有幾個人的GalGame。
你要用這種作法只會做到懷疑人生。

如果是靜圖的話,我個人的習慣是用 im.Composite

我不知道你是要用在哪裡,以下是在label裡面的用法:

label start:

#  im.Composite(
#    (1058,1256),            # 畫布大小 1058*1256,如果是 None 代表使用第一張圖的大小
#    (0,0),"stand.png",      # stand.png 放在 (0,0) 的位置
#    (499,89),"default.png"  # default.png 放在 (499,89) 的位置
#  )

  # 你怎麼用 image 就怎麼用它
  show image im.Composite((1058,1256),(0,0),"stand.png",(499,89),"default.png"):
    pos(.5,100) xanchor(.5)

  "default"

  show image im.Composite(None,(0,0),"stand.png",(499,89),"smile.png"):
    pos(.5,100) xanchor(.5)

  "smile"

  # 其他細節自己處裡

  return

但問題又來了:你一個遊戲裡面有多少角色?
你要遊戲中的所有角色純手工全做,照樣做到懷疑人生。

要用哪種作法請自行評估。

還有,我是廢柴萌新,不是什麼大佬。

确实加载慢,但我比较代码小白都是通过ai写的代码,也搞过几部renpy的离线,不过都模仿的搞的。

谢谢解答,帮助很大,本身renpy代码知道一点也搞过几个播放器,但深入一点的知识就不懂了。

谢谢回答,里面角色还挺多的,游戏素材都是通过游戏解包得来的,所以都是让ai写一个批量生成的代码搞定。