前言
當我們需要把 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 文章
謝謝您的觀看了☺️~

實在太專業👏👏👏👏👏👏👏👏
謝謝寶貝問路暖心的回饋,希望有幫助😂
感謝首陽分享🙏 有需求的朋友的福音 分析完感覺容易多了😄 只是⋯⋯ 程式語言我不通😂
謝謝軍師問路暖心的回饋😊 大感謝!
感謝首陽專業的分享
感謝劈山的回饋^^
謝謝首陽專業分享!👍太厲害了
謝謝天鳳~哈哈,其實是用人家寫好的處理 PSD 的工具&#128518;。
太太太厲害了,已跪~
謝謝寒雪,哈哈,也沒有那麼厲害啦&#128522;,希望可以幫忙解決 PSD 匯出圖片的一些問題&#128518;。
這個好方便 就不用一直右鍵另存圖片了
謝謝扶桑,真是同道中人,就是不想一直按右鍵才寫的程式&#128513;。
真的好專業!!!😳😳😳
謝謝空靈,希望能有幫助&#128518;。
真的超級專業太厲害了! 好用心的教學說明(雖然看不懂><)也許以後有機會可以向首陽請教:p
謝謝莫言的肯定~之後有機會一起討論❤️~
完全不熟的領域只能純推了><
感謝您的暖心回應🙏
太厲害了太厲害了,但我不懂不懂
謝謝阿方&竹竹的支持,好夥伴&#128516;!
謝謝首陽專業的分享與整理! 👍
謝謝踏浪,歡迎常來✨~