<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前言:
最近碰到業務需要根據PSD檔案實現PSD檔案解析圖層功能,搜到了Python的一個解析PSD的庫。這個庫就是psd-tools
,psd-tools
是一個Python軟體包,用於處理Adobe Photoshop PSD檔案。以下就是psd-tools
的基本介紹。
支援:
有限的支援:
不支援:
使用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_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.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不同。
PSDImage或圖層可以通過 numpy()
方法匯出為NumPy陣列:
image = psd.numpy() layer_image = layer.numpy()
可在原始碼的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>)
可在原始碼的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 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45