You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用psd_tools读取PSD文件时无法找到指定图层的解决方法

解决psd_tools无法定位目标文本图层的问题

你的代码只遍历了PSD的顶层图层,如果目标文本图层嵌套在**图层分组(LayerGroup)**里,就会找不到。另外代码里还有一处打印错误,保存成功的提示误写了new_text而非输出路径。

修复后的完整代码

from psd_tools import PSDImage, LayerGroup
import os

def find_text_layer(layer_or_group, target_name):
    # 递归遍历所有图层和分组
    if isinstance(layer_or_group, LayerGroup):
        for child in layer_or_group:
            found = find_text_layer(child, target_name)
            if found:
                return found
    else:
        # 判断是否为文本图层且名称匹配
        if layer_or_group.name == target_name and hasattr(layer_or_group, 'text_data'):
            return layer_or_group
    return None

def change_text_content_and_save(psd_file_path, layer_name, new_text, output_directory):
    try:
        psd = PSDImage.open(psd_file_path)
        
        # 递归查找目标文本图层
        text_layer = find_text_layer(psd, layer_name)

        if text_layer:
            text_layer.text_data.text = new_text
            print(f"已修改图层 '{layer_name}' 的文本内容为: {new_text}")

            # 确保输出目录存在
            os.makedirs(output_directory, exist_ok=True)
            
            output_file_name = os.path.basename(psd_file_path)
            output_file_path = os.path.join(output_directory, output_file_name)

            psd.save(output_file_path)
            print(f"修改后的PSD已保存至: {output_file_path}")
        else:
            # 打印所有图层名称,方便排查
            print(f"未找到文本图层: {layer_name}")
            print("当前PSD所有图层(含分组)列表:")
            def print_layers(layer, indent=0):
                prefix = "  " * indent
                if isinstance(layer, LayerGroup):
                    print(f"{prefix}[分组] {layer.name}")
                    for child in layer:
                        print_layers(child, indent+1)
                else:
                    layer_type = "文本图层" if hasattr(layer, 'text_data') else "普通图层"
                    print(f"{prefix}[{layer_type}] {layer.name}")
            print_layers(psd)

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

if __name__ == "__main__":
    psd_file_path = "C:/Text_Files/dalle.psd"
    layer_name = "emo"
    new_text = "Mehmet Ali"
    output_directory = "C:/Text_Files/output_projects"

    change_text_content_and_save(psd_file_path, layer_name, new_text, output_directory)

关键修改说明

  • 递归遍历所有图层:新增find_text_layer函数,处理嵌套的图层分组,不会遗漏深层的文本图层
  • 确保输出目录存在:添加os.makedirs调用,避免因目录不存在导致保存失败
  • 修复打印错误:将保存成功提示中的new_text改为实际输出文件路径,信息更准确
  • 增加排查辅助:未找到图层时,打印完整的图层层级结构(含分组和图层类型),便于快速定位问题
  • 优化图层判断逻辑:通过isinstance明确区分图层和分组,代码可读性更强

内容的提问来源于stack exchange,提问作者Padron_62

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:33:14