Python如何通过psd-tools解析PSD文件
Python如何通过psd-tools解析PSD文件
这篇文章主要介绍“Python如何通过psd-tools解析PSD文件”,在日常操作中,相信很多人在Python如何通过psd-tools解析PSD文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python如何通过psd-tools解析PSD文件”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
特点
支持:
-
读取和写入初级的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)
命令行
该软件包提供命令行工具来处理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
操作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')
操作使用层
在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))
SolidColorFill
, PatternFill
, 和 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 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文件”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注高防服务器网网站,小编会继续努力为大家带来更多实用的文章!
[微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。
[图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
[