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

如何用Python为Photoshop PSD文件添加可编辑文本图层

免费实现PSD可编辑文本图层的方案

问题背景

需要将PNG文件与可编辑文本图层打包为PSD文件保存。使用psd-tools尝试后,生成的文本图层被转为带透明背景的图像,无法在Krita/Gimp中编辑文本。已尝试的代码如下:

from PIL import Image, ImageDraw, ImageFont
from psd_tools.api.psd_image import PSDImage
from psd_tools.api.layers import PixelLayer
from psd_tools.constants import Compression

# Load PNG image
png_image = Image.open('fire.png').convert('RGBA')

# Create an empty PSD
psd = PSDImage.new(mode='RGBA', size=png_image.size)

# Create image layer from PNG
image_layer = PixelLayer.frompil(
    pil_im=png_image,
    psd_file=psd,
    layer_name='Image Layer',
    compression=Compression.RLE
)
psd.append(image_layer)

# Create a text image with Pillow
text = "Random Text Example"
font_size = 40

try:
    font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", font_size)
except IOError:
    font = ImageFont.load_default()

# Create a blank transparent image for the text
text_image = Image.new("RGBA", png_image.size, (0, 0, 0, 0))
draw = ImageDraw.Draw(text_image)
draw.text((50, 50), text, font=font, fill=(255, 0, 0, 255))  # Red text

# Create text layer from image
text_layer = PixelLayer.frompil(
    pil_im=text_image,
    psd_file=psd,
    layer_name='Text Layer',
    compression=Compression.RLE
)
psd.append(text_layer)

# Save PSD
psd.save('output_with_text.psd')

已知aspose-psd支持生成可编辑文本图层,但属于付费功能,现寻求免费的编程实现方式。


免费解决方案

1. 使用psd-tools的TypeLayer(推荐)

psd-tools的最新版本已支持创建可编辑的TypeLayer(矢量文本图层),无需将文本转为像素图像。

步骤:

  • 升级psd-tools到最新版本(或开发版以获取完整功能):
    pip install --upgrade psd-tools
    # 或安装开发版
    pip install git+https://github.com/psd-tools/psd-tools.git
    

修改后的代码:

from PIL import Image
from psd_tools.api.psd_image import PSDImage
from psd_tools.api.layers import PixelLayer, TypeLayer
from psd_tools.constants import Compression

# Load PNG image
png_image = Image.open('fire.png').convert('RGBA')

# Create an empty PSD
psd = PSDImage.new(mode='RGBA', size=png_image.size)

# Create image layer from PNG
image_layer = PixelLayer.frompil(
    pil_im=png_image,
    psd_file=psd,
    layer_name='Image Layer',
    compression=Compression.RLE
)
psd.append(image_layer)

# 创建可编辑文本图层
text_layer = TypeLayer(
    text="Random Text Example",
    font="DejaVu Sans",  # 注意字体名称要与系统中一致
    size=40,
    color=(255, 0, 0),  # RGB颜色
    position=(50, 50),  # 文本左上角位置
)
psd.append(text_layer)

# Save PSD
psd.save('output_editable_text.psd')

注意事项:

  • 确保字体名称与系统中安装的字体名完全匹配,否则可能无法正确显示或编辑。
  • 部分复杂文本属性(如换行、字距调整)可能需要额外参数配置。

2. 使用GIMP Python脚本自动化

GIMP原生支持PSD的可编辑文本图层,可通过Python脚本实现自动化操作,兼容性更优。

示例脚本(保存为add_text_to_psd.py):

#!/usr/bin/env python
from gimpfu import *

def add_text_to_psd(png_path, text, font_name, font_size, text_color, output_path):
    # 加载PNG图像
    image = pdb.file_png_load(png_path, png_path)
    
    # 创建文本图层
    text_layer = pdb.gimp_text_layer_new(image, text, font_name, font_size, PIXELS)
    pdb.gimp_image_add_layer(image, text_layer, 0)
    
    # 设置文本颜色(GIMP使用0-1的浮点RGB值)
    pdb.gimp_text_layer_set_color(text_layer, text_color)
    
    # 设置文本偏移位置
    pdb.gimp_layer_set_offsets(text_layer, 50, 50)
    
    # 保存为PSD(保留可编辑属性)
    pdb.file_psd_save(image, image.active_layer, output_path, output_path, 0)

# 注册GIMP插件
register(
    "python_fu_add_text_to_psd",
    "Add Editable Text to PSD",
    "Creates a PSD with editable text layer from a PNG",
    "Script Author",
    "Script Author",
    "2024",
    "Add Text to PSD...",
    "",
    [
        (PF_FILE, "png_path", "Input PNG File", ""),
        (PF_STRING, "text", "Text Content", "Random Text Example"),
        (PF_FONT, "font_name", "Font", "DejaVu Sans"),
        (PF_INT, "font_size", "Font Size", 40),
        (PF_COLOR, "text_color", "Text Color", (1.0, 0.0, 0.0)),
        (PF_FILE, "output_path", "Output PSD File", ""),
    ],
    [],
    add_text_to_psd,
    menu="<Image>/File/Create"
)

main()

运行方式:

  • 将脚本放入GIMP的插件目录(如~/.config/GIMP/2.10/plug-ins/),赋予执行权限。
  • 打开GIMP后,可通过File > Create > Add Text to PSD...手动操作,或通过命令行批量执行:
    gimp -i -b '(python-fu-add-text-to-psd RUN-NONINTERACTIVE "fire.png" "Random Text Example" "DejaVu Sans" 40 (1.0 0.0 0.0) "output_editable_text.psd")' -b '(gimp-quit 0)'
    

3. 基于libpsd的自定义实现(进阶)

如果需要更底层的控制,可使用C库libpsd结合Python绑定直接构建PSD文件结构。但该方法需要熟悉PSD文件格式,开发成本较高,仅推荐有底层开发需求的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:38:09