python操作psd,
本文主要介绍Python通过psd-tools对PSD文件的分析。文章围绕主题进行了详细介绍,具有一定的参考价值。感兴趣的朋友可以参考一下。
00-1010功能安装和使用1。命令行2。操作PSD文件3。使用第4层运行。将数据导出到PIL4。将数据导出到NumPy更多操作1。操作一个PSD文件2。操作PSD层前言:
最近遇到一个根据PSD文件实现PSD文件解析层功能的业务需求,找了一个Python的库来解析PSD。这个库是psd-tools,是一个用于处理Adobe Photoshop PSD文件的Python软件包。以下是psd-tools的基本介绍。
目录
支持:
以及读取和写入主PSD/PSB文件结构,以NumPy和PIL格式导出原始层图像有限的支持:。
构造填充图层效果的矢量蒙版基于基本图层的像素点编辑一些图层属性,比如图层名的混合模式除了溶解来绘制贝塞尔曲线不支持:.
编辑图层结构,如添加或删除图层,调整图层结构,渲染多个图层的结构字体。
特点
使用pip来安装该软件包。
pip安装PSD-工具
为了用完整的图层图像合成功能,也可以安装NumPy/SciPy:
pip安装numpy scipy
安装
简单的例子:
从psd_tools导入PSDImage
psd=PSDImage.open(example.psd )
psd.composite()。保存( example.png )
对于psd:中的层
打印(层)
layer_image=layer.composite()
layer _ image . save( % s . png % layer . name)
使用
这个包提供了命令行工具来处理PSD文件。
PSD-工具导出输入文件输出文件[选项]
PSD-工具显示输入文件[选项]
PSD-工具调试输入文件[选项]
PSD-工具-h -帮助
PSD-工具-版本
例子:
Psd-tools show example.psd #显示文件的内容
PSD-工具导出示例。PSD example.png #作为PNG输出
PSD-toolsexportexample . PSD[0]example-0.png #将图层导出为PNG
1. 命令行
psd_tools.api包提供了一个用户友好的api来处理psd文件。
打开一个图像:
来自psd_tool
s 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 ioif layer.smart_object.filetype in (jpg, png):
image = Image.open(io.BytesIO(layer.smart_object.data))
SolidColorFill
,PatternFill
, 和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 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) 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() #Truepsd.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 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中的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 内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。