如何用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
相关产品推荐
相关产品推荐

