技术标签: Python基础
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=<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)
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')
文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr
文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc
文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8
文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束
文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求
文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname
文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立
文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码
文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词
文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限
文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定
文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland