吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3591|回复: 27
收起左侧

[Python 原创] 用python实现png转psd(最新方案)

  [复制链接]
PangXiaoBin 发表于 2025-1-13 11:21

前言

我在我的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)

免费评分

参与人数 6吾爱币 +6 热心值 +6 收起 理由
HalaTest + 1 + 1 我很赞同!
beihai1314 + 1 + 1 我很赞同!
burning + 1 + 1 谢谢@Thanks!
Bob5230 + 1 + 1 我很赞同!
顶蘑菇 + 1 + 1 热心回复!
Marken888 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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的分享

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
liyitong + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

头像被屏蔽
wasm2023 发表于 2025-1-13 11:56
SU150228 发表于 2025-1-13 12:05
AI抠图怎么用
 楼主| PangXiaoBin 发表于 2025-1-13 12:08

有放开源地址
Marken888 发表于 2025-1-13 13:16
谢谢分享方法!
webphp 发表于 2025-1-13 14:09
还能这么干么呢?
 楼主| 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
分享盘里是打包的、解压即用吗?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-7-26 10:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表