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

查看 82|回复 9
作者:PangXiaoBin   
前言
我在我的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   

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

我不太懂PS图层操作,但是我测试了一下这个东西。
[ol]

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

    AI抠图怎么用
    SU150228   


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

    有放开源地址
    PangXiaoBin
    OP
      

    谢谢分享方法!
    Marken888   

    还能这么干么呢?
    webphp   


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

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

    多谢分享!!!
    zhengsg5   

    先收藏一下,谢谢楼主
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部