
前言
當我們需要把 PSD 檔內圖層,一張張的輸出成很多圖片時,就可以來看這篇教學囉。
像以前製作遊戲的時候,從美術那邊拿到 PSD 檔,要把所有圖層分開輸出成圖片,還需要圖層座標、大小等參數,才能夠拼回原本的樣子,且又是不同物件,後來都用程式處理這件事。
直接批次把圖層生成圖片,當初用的是 XML 格式,圖層的參數可以放到裡面,也有用圖層名稱區別類型,例如:圖層名「Button:AAA」 = <Button name="AAA"></Button> 之類的。
大家也可以做類似的應用,除了遊戲,網頁應該也適合這樣做😎。
不過抱歉,當時的 PSDParser 已經不見了,最近要使用的功能就簡單許多,想把 PSD 拆開放到簡報軟體裡。
這裡提供 PSD 圖層分開輸出的程式碼☺️,而且不需要開啟 PhotoShop 呢。
安裝
程式碼使用 Python,請先有 Python,這裡用的是 3.9.0,可以修改程式碼到符合自己的 Python 版本,也可以看我們以前的教學 pyenv-virtualenv 教學(介紹篇)、pyenv-virtualenv 教學(安裝篇),再創一個 Python 3.9.0 環境喔~
然後安裝套件:
pip install Pillow psd-tools
程式碼
根據輸出圖片名稱
以下兩個擇一即可。
圖片名同圖層名
# 首陽問路:https://firstsun.pixnet.net
import os
from psd_tools import PSDImage
def B2Q(s):
""" 把字串半形轉全形 """
rstring = ""
for uchar in s:
u_code = ord(uchar)
if uchar in '[\/:*?"<>|]': # 非法字符
if u_code == 32: # 全形空格直接轉換
u_code = 12288
elif 33 <= u_code <= 126: # 全形字元(除空格)根據關係轉化
u_code += 65248
rstring += chr(u_code)
return rstring
print("請輸入 .psd 檔的路徑:")
INPUT_PATH = os.path.abspath(input().strip())
OUTPUT_DIR = f"output_{os.path.basename(INPUT_PATH)}"
# 建立輸出資料夾
if not os.path.isdir(OUTPUT_DIR):
os.mkdir(OUTPUT_DIR)
psd = PSDImage.open(INPUT_PATH)
for layer in list(psd.descendants()):
try:
# 防止檔名有非法字元
name = B2Q(str(layer.name))
layer.composite().save(f"{OUTPUT_DIR}/{name}.png")
except Exception as error:
print(error)
圖層名為第幾個圖層
# 首陽問路:https://firstsun.pixnet.net
import os
from psd_tools import PSDImage
print("請輸入 .psd 檔的路徑:")
INPUT_PATH = os.path.abspath(input().strip())
OUTPUT_DIR = f"output_{os.path.basename(INPUT_PATH)}"
# 建立輸出資料夾
if not os.path.isdir(OUTPUT_DIR):
os.mkdir(OUTPUT_DIR)
psd = PSDImage.open(INPUT_PATH)
for index, layer in enumerate(list(psd.descendants())):
try:
layer.composite().save(f"{OUTPUT_DIR}/{index}.png")
except Exception as error:
print(error)
是從最下面的圖層當第 0 個,想要相反的話,可以這樣改:
enumerate(list(psd.descendants())) -> enumerate(reversed(list(psd.descendants())))
到第幾層圖層
上面 psd.descendants() 的地方,是如果有 Group,也會進去處理裡面的圖層,如果像我一樣只想處理第一層的圖層,不處理子圖層,改成這樣就可以了 psd.descendants() -> psd。
注意事項
之前遇過圖片 mask 超出運算範圍,導致生成錯誤,是 library 本身限制的問題,應該不常發生,但也有其他錯誤的可能。
因此請檢查一下生成的檔案,如有出錯,請您用軟體自行匯出該圖層,可以用 Photopea。
如果是用圖層名當檔名,要記得讓圖層名不一樣,以免生成的時候互相覆蓋。
操作
拿到程式碼後存檔成 .py 檔,我把它稱作 all_psd_layers_to_png.py,執行它!
而 clouds.psd 改成要用的 PSD 檔即可,比較大的檔案要稍微等一下。

如果您喜歡這樣的終端機,可參考安裝方式:全民寫程式|Oh My Zsh|安裝、主題、插件|終端機優化|終端機美化。
這是 clouds.psd 的圖層內容:

執行完後,會獲得 output_clouds.psd 資料夾,裡面的內容給大家看看,這裡用的是 Group 不包含子圖層的程式碼,有兩張圖片先刪掉沒有在裡面:

參考資料
更多 Python 文章
謝謝您的觀看了☺️~
