Python通过psd-tools解析PSD文件

 更新时间:2022年06月16日 16:24:41   作者:​ xpsilvester   ​  
这篇文章主要介绍了Python通过psd-tools解析PSD文件,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下

前言:

最近碰到业务需要根据PSD文件实现PSD文件解析图层功能,搜到了Python的一个解析PSD的库。这个库就是psd-toolspsd-tools是一个Python软件包,用于处理Adobe Photoshop PSD文件。以下就是psd-tools的基本介绍。

特点

支持:

  • 读取和写入初级的PSD/PSB文件结构
  • 以NumPy和PIL格式导出原始图层图像

有限的支持:

  • 基于像素的基本图层的构造
  • 填充层效果的构造
  • 矢量面具
  • 编辑一些图层属性,如图层名称
  • 除溶解外的混合模式
  • 绘制贝塞尔曲线

不支持:

  • 编辑图层结构,如添加或删除一个图层
  • 调整层的构造
  • 许多层效果的构造
  • 字体渲染

安装

使用pip来安装该软件包。

pip install psd-tools 

为了用完整的图层图像合成功能,也可以安装NumPy/SciPy:

pip install numpy scipy

使用

简单的例子:

from psd_tools import PSDImage
psd = PSDImage.open('example.psd')
psd.composite().save('example.png')
for layer in psd:
    print(layer)
    layer_image = layer.composite()
    layer_image.save('%s.png' % layer.name)

1. 命令行

该软件包提供命令行工具来处理PSD文件。

psd-tools export <input_file> <output_file> [options]
psd-tools show <input_file> [options]
psd-tools debug <input_file> [options]
psd-tools -h | --help
psd-tools --version

例子:

psd-tools show example.psd  # 显示文件内容
psd-tools export example.psd example.png  # 导出为PNG
psd-tools export example.psd[0] example-0.png  # 将图层导出为PNG

2. 操作PSD文件

psd_tools.api 包提供了用户友好的API来处理PSD文件。

打开一个图像:

from psd_tools import PSDImage
psd = PSDImage.open('my_image.psd')

psd-tools中的大部分数据结构都支持在IPython环境下的打印:

In [1]: PSDImage.open('example.psd')
Out[1]:
PSDImage(mode=RGB size=101x55 depth=8 channels=3)
  [0] PixelLayer('Background' size=101x55)
  [1] PixelLayer('Layer 1' size=85x46)

内部层可以通过迭代器或索引进行访问:

for layer in psd:
    print(layer)
    if layer.is_group():
        for child in layer:
            print(child)

child = psd[0][0]

打开的PSD文件可以保存:

psd.save('output.psd')

3. 操作使用层

在Photoshop中,有各种层的种类。

最基本的图层类型是PixelLayer:

print(layer.name)
layer.kind == 'pixel'

有些图层属性是可编辑的,如图层名称:

layer.name = 'Updated layer 1'

组里有内部层:

for layer in group:
    print(layer)
first_layer = group[0]

TypeLayer 是一个带有文本的层:

print(layer.text)

ShapeLayer 绘制一个矢量形状,形状信息存储在vector_mask和origination属性中。其他层也可以有形状信息作为遮罩:

print(layer.vector_mask)
for shape in layer.origination:
    print(shape)

SmartObjectLayer 嵌入或链接一个外部文件,用于非破坏性编辑。文件内容可以通过smart_object属性访问:

import io
if layer.smart_object.filetype in ('jpg', 'png'):
    image = Image.open(io.BytesIO(layer.smart_object.data))

SolidColorFillPatternFill, 和 GradientFill 是填充图层,如果没有相关的遮罩,它们会绘制整个区域。 AdjustmentLayer 的子类表示应用于组成图像的层调整。参见 Adjustment layers.

4. 将数据导出到 PIL

将整个文件导出为 PIL.Image:

image = psd.composite()
image.save('exported.png')

导出单一图层,包括遮罩和剪裁层:

image = layer.composite()

分别导出图层和蒙版,不需要合成:

image = layer.topil()
mask = layer.mask.topil()

要合成特定的图层,如除文本外的图层,请使用layer_filter选项:

image = psd.composite(
    layer_filter=lambda layer: layer.is_visible() and layer.kind != 'type')

请注意:大多数图层效果和调整层不被支持。合成的结果可能看起来与Photoshop不同。

4. 将数据导出到NumPy

PSDImage或图层可以通过 numpy() 方法导出为NumPy数组:

image = psd.numpy()
layer_image = layer.numpy()

更多操作

1. 操作一个PSD文件

可在源码的psd_image.py中看到PSDImage类

1. 打开一个文件

from psd_tools import PSDImage
psd = PSDImage.open('my_image.psd')
#返回一个PSDImage类型的对象

#psd_tools中的大多数数据结构都支持在IPython环境中进行漂亮的打印。

#  In [1]: PSDImage.open('example.psd')
#  Out[1]:
#  PSDImage(mode=RGB size=101x55 depth=8 channels=3)
#    [0] PixelLayer('Background' size=101x55)
#    [1] PixelLayer('Layer 1' size=85x46)

2. psd的属性(可在源码的psd_image.py中看到PSDImage类)

有些无意义的属性也定义了,为了和layer一样可以,如:visible直接返回Ture。

这里列出一些有意义,一般会用到的属性:

psd.width #宽
psd.height #高
psd.size #(width, height) tuple
psd.offset #(left, top) tuple
psd.left #0
psd.right #self.width
psd.top #0
psd.bottom #self.height
psd.viewbox #(left, top, right, bottom) `tuple`

psd.bbox #能包围住所有可见的层的最小的方框(x,y,z,w)
psd.color_mode #颜色模式,如RGB,GRAYSCALE
psd.channels #颜色通道数量
psd.depth #像素深度位数
psd.version #文件版本 psd是1,psb是2.
psd.has_preview #Returns if the document has real merged data. When True, `topil()`returns pre-composed data.
psd.has_thumbnail #是否有缩略图
psd.thumbnail #返回    PIL.Image格式的缩略图

这里列出一些无意义的为了可以和layer一样操作的属性:

psd.is_visible() #True
psd.visible #True
psd.parent #None
psd.name   #'Root'
psd.kind #'psdimage'

print(str(psd.is_group()))#是否是组 psd文件直接传进去也是组
psd文件的层可以遍历:
for layer in psd:
print(layer)
if layer.is_group():
    for child in layer:
        print(child)

child = psd[0][0]
#迭代顺序是从背景到前景,与1.7.x之前的版本相反。使用reverse (list(psd))从前台到后台进行迭代。

3. 保存psd文件

psd.save('output.psd')

4. 用psd文件获取PIL Image.

psd.topil(channel=None, **kwargs)
#channel:0为R,1为G,2为B,-1为A,根据constants.py中ChannelID类。

5. 合并psd文件.

psd.compose(force = False,bbox=None,**kwargs)

6. 用PIL Image生成一个PSDImage对象

from psd_tools import PSDImage
psd = PSDImage.frompilfrompil(image,compression=<Compression.PACK_BITS: 1>)

2. 操作一个PSD图层

可在源码的layers.py中看到Layer类

1.Layer的属性(可在源码的layers.py中看到Layer类)

layer.name #层的名字(可写)
layer.kind #层的类别(字符串)

#(group(图层组), pixel(普通图层), shape, type(文本图层), smartobject,or psdimage(psd本身))
#shape绘制矢量形状,形状信息存储在vector_mask和origination属性中。其他图层也可以有形状信息作为蒙版:
#smartobject为非破坏性编辑嵌入或链接外部文件。文件内容可以通过smart_object属性访问。

layer.layer_id #Layer ID.
layer.visible #层本身是否勾选可见(可写)
layer.is_visible() #层是否可见,受父物体影响。(父物体不可见,这个层就算勾选了可见这个也是False)

layer.opacity #透明度 [0,255](可写)
layer.parent #Parent of this layer.
layer.is_group #是否是个组
layer.blend_mode #混合模式(可写),返回Constants.py中的BlendMode
layer.has_mask #是否有mask
layer.left #左坐标(可写)
layer.top  #顶坐标(可写)
layer.right #右坐标
layer.bottom #底坐标
layer.width #层的宽
layer.height #层的高
layer.offset #(left, top) tuple. (可写)
layer.size #(width, height) tuple.
layer.bbox #(left, top, right, bottom) tuple.
layer.has_pixels() #是否有像素
layer.has_mask() #是否有蒙板
layer.has_vector_mask() #是否有矢量蒙板
layer.mask #层相关的蒙版 return: :py:class:`~psd_tools.api.mask.Mask` or `None`
layer.vector_mask #层相关的矢量蒙版 return: :py:class:`~psd_tools.api.shape.VectorMask` or `None`
layer.has_origination() #是否有实时形状属性
layer.origination #实时形状属性
layer.has_stroke() #是否有比划
layer.stroke #比划
layer.has_clip_layers() #是否有裁剪
layer.clip_layers #裁剪,Clip layers associated with this layer.
layer.has_effects() #是否有效果处理
layer.effects #效果处理 return: :py:class:`~psd_tools.api.effects.Effects`
layer.tagged_blocks #Layer tagged blocks that is a dict-like container of settings.

2. 获得图层的pil图,Get PIL Image of the layer.(返回PIL.Image对象或没像素时返回`None`)

layer.topil(channel=None, **kwargs)
e.g.
from psd_tools.constants import ChannelID
image = layer.topil()
red = layer.topil(ChannelID.CHANNEL_0)
alpha = layer.topil(ChannelID.TRANSPARENCY_MASK)

3. 合并图层和其蒙版(mask, vector mask, and clipping layers)(返回PIL.Image对象或没像素时返回`None`)

layer.compose(bbox=None, **kwargs)

不合并,单独获取:

image = layer.topil()
mask = layer.mask.topil()
from psd_tools import compose
clip_image = compose(layer.clip_layers)

到此这篇关于Python通过psd-tools解析PSD文件的文章就介绍到这了,更多相关Python PSD 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Python大批量写入数据(百万级别)的方法

    Python大批量写入数据(百万级别)的方法

    这篇文章主要给大家介绍了关于Python大批量写入数据(百万级别)的相关资料,在日常处理数据的过程中,我们都有批量写入数据的需求,文中给出了详细的示例代码,需要的朋友可以参考下
    2023-07-07
  • 编写多线程Python服务器 最适合基础

    编写多线程Python服务器 最适合基础

    很好的Python多线程基础教程,能够帮助初学者快速了解Python多线程简单实现。线程可以使任何程序运行得更快。但是这也增加了代码的复杂性。所以,如果你发现很难理解,那么添加更多的日志将有助于检查里面发生了什么
    2018-09-09
  • python读取excel指定列数据并写入到新的excel方法

    python读取excel指定列数据并写入到新的excel方法

    今天小编就为大家分享一篇python读取excel指定列数据并写入到新的excel方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 深入理解 Python 中的 pip 虚拟环境(最佳实践)

    深入理解 Python 中的 pip 虚拟环境(最佳实践)

    本文深入讲解了Python中pip虚拟环境的概念及其重要性,并详细介绍了如何创建、激活和管理虚拟环境,以及如何使用requirements.txt文件记录和管理项目依赖,文章指出,使用虚拟环境可以有效避免依赖冲突,为每个项目提供一个干净的开发环境,使得项目更易于维护和部署
    2024-10-10
  • opencv对多种颜色小球的形状及位置判断方式

    opencv对多种颜色小球的形状及位置判断方式

    在这段时间参加了一个竞赛,写下了这个代码,但是总感觉有一些地方是不完善!这是一个关于使用opencv库判断颜色小球形状及位置的功能实现,其中也参考了一些前辈的代码,希望能对迷茫中的小伙帮有所帮助
    2022-11-11
  • Python网络爬虫四大选择器用法原理总结

    Python网络爬虫四大选择器用法原理总结

    这篇文章主要介绍了Python网络爬虫四大选择器用法原理总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 解决keras+flask模型的重复调用出错ValueError: Tensor is not an element of this graph

    解决keras+flask模型的重复调用出错ValueError: Tensor is n

    这篇文章主要介绍了解决keras+flask模型的重复调用出错ValueError: Tensor is not an element of this graph问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Python 实现list,tuple,str和dict之间的相互转换

    Python 实现list,tuple,str和dict之间的相互转换

    这篇文章主要介绍了Python 实现list,tuple,str和dict之间的相互转换,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 详解Python之数据序列化(json、pickle、shelve)

    详解Python之数据序列化(json、pickle、shelve)

    本篇文章主要介绍了Python之数据序列化,本节要介绍的就是Python内置的几个用于进行数据序列化的模块,有兴趣的可以了解一下。
    2017-03-03
  • python脚本当作Linux中的服务启动实现方法

    python脚本当作Linux中的服务启动实现方法

    今天小编就为大家分享一篇python脚本当作Linux中的服务启动实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06

最新评论