需求類似內建的「影像」→「剪裁出內容」,但不是移除透明部分,而是針對具有上下黑邊(letterbox)甚至有視窗標題 UI 元素的圖片,偵測黑邊再裁掉。
第一次用 GIMP 做自動化,官方文件好像就 Gimp Python Documentation 一篇(25 年前的文章?),四處做功課終於兜起來,但也發現可能已成孤兒。
GIMP 2 外掛的過時風險
目前用的穩定版 GIMP 2.10.38(2024/5/5 釋出),內嵌 python 版本是早就 EOL 的 2.7(新作業系統都升到 3 了,兩版共存時期是一場惡夢);
雖然 GIMP 3 仍會使用 python,但舊的 pygimp
API 早已在開發分支刪除,所以現在是很尷尬的狀態,查文件也困難,投身其中要自求多福。
目錄
Python-fu 外掛安裝方式
一開始有點混亂為什麼有 Script-fu 和 Python-fu,又為什麼有「外掛程式」和「命令稿」資料夾。 最後理解 Script-fu 和「命令稿」是比較早發展的功能,用 Scheme 語言寫的東西。 雖然直覺 python 寫的東西也是 script,但裝到錯的目錄就什麼也不會發生,要自己小心避開。
假設已經取得指令碼 xxx.py
,具體安裝步驟為:
-
找出外掛資料夾。
選單「編輯」→「偏好設定」→ 左邊樹狀選單「資料夾」→「外掛程式」, Windows 預設在%USERPROFILE%\AppData\Roaming\GIMP\2.10\plug-ins
。
可以按右邊按鈕用檔案瀏覽器打開,預設應該是空資料夾。
-
把指令碼放進外掛資料夾。
- 結束 GIMP 再重開。
-
成功的話,選單會出現新項目。
出現在選單哪個位置是程式內容指定的,我這支是寫在「濾鏡」→「Python-fu」→「剪裁外框黑邊」。
一開始無法點選,要先用 GIMP 開啟圖片,才可以使用。
如果選單沒成功新增,可能載入時有錯誤。 我還未找到好的除錯方法,但 Windows 在 GIMP 啟動捷徑加上--verbose --console-messages
會多顯示一些訊息。
指令碼內容與功能
程式碼放在 gist → https://gist.github.com/bootleq/88341006e04
運作原理是從畫面頂端開始,往下找出黑色的像素,當連續出現 N 個黑色時,就判斷為黑邊,最後一個黑色像素就是黑邊的終點。
為了減少誤判,找到終點時,會在相同水平位置上再取另一個點,確認它也是黑色,否則就不算,要重找。
實際上重找的寫法沒有很嚴謹,目前只會用水平 25、50、75% 的點做有限度的嘗試。
頂端向下找完,同樣邏輯由底端向上找,就能取得上下邊了。
可以調整的參數有兩個:
-
黑邊的最小厚度(像素)
例如連續偵測到 30 個黑色像素時,才認定為黑邊。
-
搜尋不到黑邊時的停損比例(例:50 只會搜尋到圖片高的一半)
當程式找不到黑邊時,繼續掃描每個像素很浪費時間。
這個選項假設黑邊不會佔據圖片太大比例,例如設為 5 的話,在由頂端往下的搜尋中,只走圖片高度 %5 的距離就會停止了(放棄,當作找不到),若 5% 以下其實還有黑邊,那部分就不會被裁掉。
使用 BIMP 進行批次處理
GIMP 好像沒有內建批次功能,所以還要裝 BIMP 這個外掛來處理。
- 「檔案」→「Batch Image Manipulation...」→ 操作列表「+ Add」→「其他 GIMP 操作...」。
-
在「搜尋」欄中輸入
letter
篩出python-fu-crop-letterbox-edges
,點選後可以在右邊調整參數,調完按 OK 套用。
- 選好輸入和輸出檔案後,按「Apply」就會開始跑了。
參考資料
一路從官方文件、ChatGPT 甚至到 GIMP 原始碼,覺得很不親切,最後還是只留兩篇人類寫的文章吧。