[python库]psd文件操作库 您所在的位置:网站首页 psd文件怎么查看图层内容 [python库]psd文件操作库

[python库]psd文件操作库

2024-01-28 16:18| 来源: 网络整理| 查看: 265

psd-tools

psd-tools是处理Photoshop的psd文件的python库。

源码地址:https://github.com/psd-tools/psd-tools 文档地址:https://psd-tools.readthedocs.io/en/latest/

一、安装: pip install psd-tools #这个包里需求了 Pillow(用于将图像导出到PNG,处理它们),所以安装时会自动安装,不需要额外安装

为了从32位PSD文件中提取图像,PIL/Pillow必须使用LITTLECMS或LITTLECMS2支持来构建(apt-get install liblcms2-2或brew install little-cms2)

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

pip install numpy scipy

以下情况Numpy是必要的:

使用正常模式以外的混合模式;使用渐变填充。 二、使用

0/ 示例

from psd_tools import PSDImage psd = PSDImage.open('example.psd') psd.compose().save('example.png') for layer in psd: print(layer)

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=)

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) 三、操作案例

1、导出一个psd文件的所有图层(用文件本身的大小,而不是图层的大小)

思路:

遍历所有图层,每次导出一个目前图层 把除目标图层外的图层(is_group()要为False,图层组不隐藏)隐藏,设置visible为False,目标图层的visible设置为True 然后调用:

merged_image = psd.compose(True) merged_image.save(exportName) #依据实验,这里参数force要为True,否则不是目前设置好的图层显隐看出来的图。 #看源码可知,force为False时,使用的图是topil()返回的PIL Image,貌似不会受临时修改的图层显隐影响;(不太确定这个图生成的时机,但好像只会生成一次) #force为True使用的图为compose所有图层产生的PIL Image,所以会根据所有图层现在的显隐去生成新图。

导出文件。

2.导出一个psd文件的所有图层(用图层本身的大小)

思路:

这个比较简单,就直接调用

#不带蒙版 layer_image = layer.topil() layer_image.save('layer.png')

或者

#带蒙版 layer.compose() layer_image.save('layer.png')


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有