返回顶部
首页 > 资讯 > 后端开发 > Python >Python通过psd-tools解析PSD文件
  • 920
分享到

Python通过psd-tools解析PSD文件

2024-04-02 19:04:59 920人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录特点安装使用1. 命令行2. 操作PSD文件3. 操作使用层4. 将数据导出到 PIL4. 将数据导出到NumPy更多操作1. 操作一个PSD文件2. 操作一个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 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python通过psd-tools解析PSD文件

本文链接: https://lsjlt.com/news/118769.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python通过psd-tools解析PSD文件
    目录特点安装使用1. 命令行2. 操作PSD文件3. 操作使用层4. 将数据导出到 PIL4. 将数据导出到NumPy更多操作1. 操作一个PSD文件2. 操作一个PSD图层前言: ...
    99+
    2024-04-02
  • Python如何通过psd-tools解析PSD文件
    这篇文章主要介绍“Python如何通过psd-tools解析PSD文件”,在日常操作中,相信很多人在Python如何通过psd-tools解析PSD文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Pytho...
    99+
    2023-07-02
  • 怎么在Python中使用psd-tools转换文件
    怎么在Python中使用psd-tools转换文件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、说明psd文件是Phtoshop图片格式,使用Python的库psd-too...
    99+
    2023-06-15
  • python通过http上传文件思路详解
    这里主要是解决multipart/form-data这种格式的文件上传,基本现在http协议上传文件基本上都是通过这种格式上传 1 思路 一般情况下,如果我们往一个地址上传文件,则必...
    99+
    2024-04-02
  • python通过文件头判断文件类型
    对于提供上传的服务器,需要对上传的文件进行过滤。 本文为大家提供了python通过文件头判断文件类型的方法,避免不必要的麻烦。 分享代码如下 import struct # 支持文件类型 # 用...
    99+
    2022-06-04
    文件类型 文件 python
  • python通过生成cookie文件,并
    今天有个需求需要通过cookie访问内部cmdb,获取机器等信息。上网搜罗了一下用法。记录一下带密码直接访问的# -*- coding: utf-8 -*- # !/usr/bin/python import urllib2 import ...
    99+
    2023-01-31
    文件 python cookie
  • python编译pyc文件的过程解析
    什么是pyc文件 pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,...
    99+
    2024-04-02
  • python如何通过http上传文件
    这篇文章主要介绍“python如何通过http上传文件”,在日常操作中,相信很多人在python如何通过http上传文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python如何通过http上传文件”的疑...
    99+
    2023-06-20
  • python通过sftp远程传输文件
    python提供了一个第三方模块paramiko,通过这个模块可以实现两台机器之间的网络连接,sftp是paramiko的一个方法,使用sftp可以在两台机器之间互相传输拷贝文件。然而paramiko的sftp只能拷贝文件,...
    99+
    2023-01-31
    传输文件 python sftp
  • 通过python读取ini配置文件
    ini是啥你可以理解为就是一个配置文件的统称吧。比如test.conf,这样的你可以理解为他就是ini文件,里面一般存放一些配置信息。比如数据库的基本信息,一会我们进行讲解!那么ta的好处是啥呢?就是把一些配置信息提出去来进行单独管理,如果...
    99+
    2023-01-31
    配置文件 python ini
  • 通过Android trace文件分析死锁ANR实例过程
    对于从事Android开发的人来说,遇到ANR(Application Not Responding)是比较常见的问题。一般情况下,如果有ANR发生,系统都会在/data/an...
    99+
    2022-06-06
    anr Android
  • 详解Nodejs 通过 fs.createWriteStream 保存文件
    工作中难免会遇到处理大文件的时候,有这种stream的处理方式,就不需要一次处理太大的文件,从而导致内存不够用,或者内存占用太多。 fs.createWriteStream 似乎不会自己创建不存在的文件夹,...
    99+
    2022-06-04
    详解 保存文件 fs
  • 在 Python 中读取 gzip 文件的过程解析
    目录Python 中的 gzip 模块压缩文件的重要性在 Python 中使用 gzip 压缩文件使用 gzip 模块时的数据添加在 Python 中读取 gzip 文件在 Pyth...
    99+
    2023-05-19
    Python读取 gzip 文件 Python gzip 文件
  • python解析elf文件
    #!/usr/bin/python import struct import sys elfhdr = {} def verify_elf(filename): f = open(filename,'rb') elfident = ...
    99+
    2023-01-31
    文件 python elf
  • python 解析 eml文件
    #-*- encoding: gb2312 -*- import email fp = open('xxxx.eml', "r") msg = em...
    99+
    2023-01-31
    文件 python eml
  • ubuntu如何通过命令解压文件
    在Ubuntu中,可以使用以下命令来解压文件:1. 解压tar.gz文件:```tar -zxvf 文件名.tar.gz```其中,...
    99+
    2023-08-16
    ubuntu
  • 通过Python计算一个文件夹大小
    在进行计算一个文件夹内容大小的时候,我们要考虑文件夹内都有什么内容,可能都是一个一个的单文件,也有可能都是子文件夹,或者二者都有,既然要计算整个文件夹的大小,我们当然要计算每一个文件的大小以及每一个子文件夹下的每一个子文件。计算每一个文件...
    99+
    2023-01-30
    文件夹 大小 Python
  • python通过SSH获取远端主机文件
    easy_install.exe sshimport ssh client = ssh.SSHClient() client.set_missing_host_key_policy(ssh.AutoAddPolicy()) client.c...
    99+
    2023-01-31
    远端 主机 文件
  • 解析Ford-Fulkerson算法并通过Python实现
    Ford-Fulkerson算法是贪心算法,用于计算网络中的最大流量。其原理是找到剩余容量为正的增广路径,只要找到增广路径,就可以继续增加路径和计算流量。直到增广路径不再存在,这时就能得出最大流量。 Ford-Fulkerson算...
    99+
    2024-01-23
    贪心算法
  • 通过Python的speech_recognition库将音频文件转为文字
    目录前言一、音频准备二、音频声音三、格式转换四、音频转文字1.引入库2.定义音频路径3.创建一个Recognizer对象4.打开音频文件,将音频文件读入Recognizer对象5.尝...
    99+
    2023-05-20
    Python音频文件转为文字 Python speech_recognition库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作