PangXiaoBin 发表于 2025-1-13 11:21

用python实现png转psd(最新方案)

###前言
我在我的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)
```

a673034170 发表于 2025-1-13 15:09

图片转PSD,和我创建一个PSD把图片复制进去有什么差别

HalaTest 发表于 2025-1-13 22:27

本帖最后由 HalaTest 于 2025-1-14 13:21 编辑

我不太懂PS图层操作,但是我测试了一下这个东西。
1. 首先使用的是我没有动过的JPG图片,这个能转换成psd,P图软件也能打开这很OK,但是代码中这里有什么意义我 不太理解,这里的代码是将图片转换为了psd格式,我把后面加图层的代码注释掉了,转换过来的psd打开里面是有一个Layer的应该就是图层,属性显示是像素图层。
```
    # 将PIL图像转换为PSD格式
    psd = PSDImage.frompil(image_obj)
    psd.save(save_path)# 保存为PSD文件
```
然后我这里又按照你的代码再运行一遍,得到的psd打开属性是文档,下面图层那里显示的是背景,有一把小锁,点一下锁就变的和上面的一样了,我不明白这里的意义,如果可以请通俗一点告诉我,我是ps小白但想学习
```
# 创建一个新图层
    pixel_layer = PixelLayer.frompil(image_obj, psd)
    pixel_layer.visible = True# 设置图层为可见

    psd.append(pixel_layer)# 将图层添加到PSD中
    psd.save(save_path)# 保存为PSD文件
```
2. ~~然后我又拿了一张以前用AI扣出来的png图片试了一下,呀,奇怪的事情发生了,我注释了你新建图层的代码得到的psd打开,图层显示和我扣出来的图片一样。当我使用你完整代码运行时,得到的psd打开,发现里面的图层,它它它它它竟然变成我抠图之前原来的图片了。。。~~
上面说反了,是不按照楼主加图层,保存的psd打开,里面图层就变回和没有抠图的原图一样了。也挺神奇的哈哈
附:我使用的png图片:
通过网盘分享的文件:test.png
链接: https://pan.baidu.com/s/1nPwwXpucnsfyAJci5q0iaQ?pwd=m4j3 提取码: m4j3
--来自百度网盘超级会员v8的分享

wasm2023 发表于 2025-1-13 11:56

SU150228 发表于 2025-1-13 12:05

AI抠图怎么用

PangXiaoBin 发表于 2025-1-13 12:08

SU150228 发表于 2025-1-13 12:05
AI抠图怎么用

有放开源地址

Marken888 发表于 2025-1-13 13:16

谢谢分享方法!

webphp 发表于 2025-1-13 14:09

还能这么干么呢?;www

PangXiaoBin 发表于 2025-1-13 15:37

a673034170 发表于 2025-1-13 15:09
图片转PSD,和我创建一个PSD把图片复制进去有什么差别

代码实现可以支持批量操作 这只是一个小点
程序自动转换,不比你人工一个一个处理方便么
我这里的场景是把抠除的透明png图层叠加到原图上面

guige2023 发表于 2025-1-13 16:15

先收藏一下,谢谢楼主

wsasecy 发表于 2025-1-13 18:03

分享盘里是打包的、解压即用吗?
页: [1] 2 3
查看完整版本: 用python实现png转psd(最新方案)