文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python如何通过psd-tools解析PSD文件

2023-07-02 10:48

关注

这篇文章主要介绍“Python如何通过psd-tools解析PSD文件”,在日常操作中,相信很多人在Python如何通过psd-tools解析PSD文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python如何通过psd-tools解析PSD文件”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

特点

支持:

有限的支持:

不支持:

安装

使用pip来安装该软件包。

pip install psd-tools

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

pip install numpy scipy

使用

简单的例子:

from psd_tools import PSDImagepsd = 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)

命令行

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

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

例子:

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

操作PSD文件

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

打开一个图像:

from psd_tools import PSDImagepsd = 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')

操作使用层

在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 ioif layer.smart_object.filetype in ('jpg', 'png'):    image = Image.open(io.BytesIO(layer.smart_object.data))

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

将数据导出到 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不同。

将数据导出到NumPy

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

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

更多操作

1.操作一个PSD文件

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

1. 打开一个文件

from psd_tools import PSDImagepsd = 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) tuplepsd.offset #(left, top) tuplepsd.left #0psd.right #self.widthpsd.top #0psd.bottom #self.heightpsd.viewbox #(left, top, right, bottom) `tuple`psd.bbox #能包围住所有可见的层的最小的方框(x,y,z,w)psd.color_mode #颜色模式,如RGB,GRAYSCALEpsd.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() #Truepsd.visible #Truepsd.parent #Nonepsd.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 PSDImagepsd = 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中的BlendModelayer.has_mask #是否有masklayer.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 ChannelIDimage = 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 composeclip_image = compose(layer.clip_layers)

到此,关于“Python如何通过psd-tools解析PSD文件”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯