我在我的AI抠图 【https://github.com/pangxiaobin/image-matting】 A项目中,新增了一个非常实用的功能——导出PSD(Photoshop)格式。然而实现这个功能的过程中却遇到了一不少问题,这里做个分享。
查找了网上相关的信息:Google、Stack Overflow、知乎、掘金等平台上提供的解决方案大多已过时,或者无法解决这个问题,各种AI提供的解决方案也是一本正经的胡说八道,后面通过调试和查阅psd-tools的最新文档(psd-tools 最新版本有比较大的改动),终于找到了一种有效的解决方案。可以说目前网上出现相关的使用python把png转psd的方案目前没有找到成功的。
为什么要导出PSD?
目前AI抠图生成的数据还会有一些问题,而且目前提供的图片编辑器之前简单的橡皮擦功能,这时就需要使用专业的软件进行快速的处理,也有一些人提出了这个需求,就在软件中提供了这个功能。
如何实现PNG到PSD的转换?
经过研究,最终还是使用Python中的psd-tools库。然而,许多现有的教程和示例已经不适用于最新版本的psd-tools。因此,以下是基于最新版本文档得到的的实现步骤。
我使用google搜索、stackoverflow、知乎、掘进、百度、微信搜索、和AI工具来提问,最后给的结果都是错误的,要么是过时的。(psd-tools 最新版本有比较大的改动
需要引入的依赖库
# 最新版本 psd-tools==1.10.0 Pillow==10.4.0
pip install psd-tools Pillow
实现代码如下
from PIL import Image
from io import BytesIO
import os
import traceback
from psd_tools import PSDImage
from psd_tools.api.layers import PixelLayer
def image_to_psd(image_obj: Image, save_path):
# 确保图像模式为 RGBA
if image_obj.mode != "RGBA":
image_obj = image_obj.convert("RGBA")
# 将PIL图像转换为PSD格式
psd = PSDImage.frompil(image_obj)
# 创建一个新图层
pixel_layer = PixelLayer.frompil(image_obj, psd)
pixel_layer.visible = True # 设置图层为可见
psd.append(pixel_layer) # 将图层添加到PSD中
psd.save(save_path) # 保存为PSD文件
if __name__ == "__main__":
image_obj = Image.open('demo.png')
save_path = 'demo.psd'
image_to_psd(image_obj, save_path)