需求類似內建的「影像」→「剪裁出內容」,但不是移除透明部分,而是針對具有上下黑邊(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 早已在開發分支刪除,所以現在是很尷尬的狀態,查文件也困難,投身其中要自求多福。


目錄

  1. Python-fu 外掛安裝方式
  2. 指令碼內容與功能
  3. 使用 BIMP 進行批次處理
  4. 參考資料

Python-fu 外掛安裝方式

一開始有點混亂為什麼有 Script-fu 和 Python-fu,又為什麼有「外掛程式」和「命令稿」資料夾。 最後理解 Script-fu 和「命令稿」是比較早發展的功能,用 Scheme 語言寫的東西。 雖然直覺 python 寫的東西也是 script,但裝到錯的目錄就什麼也不會發生,要自己小心避開。

假設已經取得指令碼 xxx.py,具體安裝步驟為:

  1. 找出外掛資料夾。
    選單「編輯」→「偏好設定」→ 左邊樹狀選單「資料夾」→「外掛程式」, Windows 預設在 %USERPROFILE%\AppData\Roaming\GIMP\2.10\plug-ins
    可以按右邊按鈕用檔案瀏覽器打開,預設應該是空資料夾。
    外掛資料夾
  2. 把指令碼放進外掛資料夾。
    指令碼在 Windows 檔案總管中的樣子
  3. 結束 GIMP 再重開。
  4. 成功的話,選單會出現新項目。
    出現在選單哪個位置是程式內容指定的,我這支是寫在「濾鏡」→「Python-fu」→「剪裁外框黑邊」。
    一開始無法點選,要先用 GIMP 開啟圖片,才可以使用。
    選單中的新項目,但在還沒開啟圖片時,是不能點選的
    如果選單沒成功新增,可能載入時有錯誤。 我還未找到好的除錯方法,但 Windows 在 GIMP 啟動捷徑加上 --verbose --console-messages 會多顯示一些訊息。

指令碼內容與功能

程式碼放在 gist → https://gist.github.com/bootleq/88341006e04

運作原理是從畫面頂端開始,往下找出黑色的像素,當連續出現 N 個黑色時,就判斷為黑邊,最後一個黑色像素就是黑邊的終點。

為了減少誤判,找到終點時,會在相同水平位置上再取另一個點,確認它也是黑色,否則就不算,要重找。
實際上重找的寫法沒有很嚴謹,目前只會用水平 25、50、75% 的點做有限度的嘗試。

頂端向下找完,同樣邏輯由底端向上找,就能取得上下邊了。

可以調整的參數有兩個:

選項參數與預設值
  1. 黑邊的最小厚度(像素)

    例如連續偵測到 30 個黑色像素時,才認定為黑邊。

  2. 搜尋不到黑邊時的停損比例(例:50 只會搜尋到圖片高的一半)

    當程式找不到黑邊時,繼續掃描每個像素很浪費時間。
    這個選項假設黑邊不會佔據圖片太大比例,例如設為 5 的話,在由頂端往下的搜尋中,只走圖片高度 %5 的距離就會停止了(放棄,當作找不到),若 5% 以下其實還有黑邊,那部分就不會被裁掉。


使用 BIMP 進行批次處理

GIMP 好像沒有內建批次功能,所以還要裝 BIMP 這個外掛來處理。

  1. 「檔案」→「Batch Image Manipulation...」→ 操作列表「+ Add」→「其他 GIMP 操作...」。
  2. 在「搜尋」欄中輸入 letter 篩出 python-fu-crop-letterbox-edges,點選後可以在右邊調整參數,調完按 OK 套用。
    在 BIMP 對話框中調整 python-fu-crop-letterbox-edges 選項
  3. 選好輸入和輸出檔案後,按「Apply」就會開始跑了。

參考資料

一路從官方文件、ChatGPT 甚至到 GIMP 原始碼,覺得很不親切,最後還是只留兩篇人類寫的文章吧。