[Part I. GIMP基礎功]

[Part II. 一種效果的誕生]
[Part III. Script-Fu的秘密]



13.5 Script-Fu Code 與 GIMP 介面視窗之互動

你可以混合 Script-Fu Code 與 介面視窗的操作
  • 互動,意指一部分操作 GIMP 介面視窗,一部分由 Script-Fu Code 完成。
  • 在 GIMP 之中,大多數的操作,都可用程式碼來完成。
  • 但是,不一定要寫成一個「完整的 Script-Fu 的 scm 檔案」,不一定要完全自動化整套的影像處理流程。
  • 以「開檔」為例
    • 開啟影像檔,可透過介面視窗的選單,與對話盒的操作。
    • 開啟影像檔,也可使用 Script-Fu Code 。
    • 開檔,其對應的函式為 gimp-file-load 。
  • 半自動化的操作方式
    • 也許,可以用 gimp-file-load 函式載入影像檔,再透過 GIMP 介面視窗的操作來畫圖。
    • 也許,可以用 GIMP 介面視窗開啟影像檔,產生一個形狀特殊的選取區域,再利用 Script-Fu Code 連續執行幾個濾鏡來潤飾影像。
  • 對於,初學 Script-Fu 的人,這種半自動化的操作方式,更容易體會 Script-Fu 優點,更容易學習 Script-Fu 。


在 GIMP 之中,什麼是「物件」?
  • 類似於「物件導向程式設計」對於物件的定義,物件包裹了一些資料變數與一組相關的操作函式。
  • 在 GIMP 之中,影像、色版、圖層、選取區域、遮罩,這些東西都可稱為物件。
  • 如果要用 Script-Fu Code 來控制 GIMP 介面視窗的操作,至少要知道影像物件的 id 。


Scheme 最重要的資料結構是 list
  • GIMP 對各種物件的 id 都採用流水號的編排,從 1 開始編號 。
  • Script-Fu 所用的與語言是 Scheme。
  • Scheme 最重要的資料結構 list。
  • 但是 Scheme list 資料索引值是從 0 開始增加的 。


要會區別 atom 與 list ,不然,很容易寫出錯誤的程式碼
  • list 可以是空的,也可以只有一個 atom 。
  • 一個 list 可以儲存很多 atom 。
  • 甚至, list 內部還可儲存其它 list 的資料結構。
  • 下面是錯誤的,因為回傳值是一個 list 。
    • (define drw (gimp-image-get-active-layer img))
    • 回傳值是 list 內部包含了一個「圖層 id」
  • 下面是正確的,car 函數會取出 list 的頭(第一個元素)。
    • (define drw (car (gimp-image-get-active-layer img)))
    • 「圖層 id」是正整數 1 、2 、3 ......


取得視窗所承載的影像 id
  • 以簡單的方形黑色塊,示範 id 的取得。

  • 從影像視窗的標題列得知,第一張開啟的影像編號為 1.0

  • 重複開啟相同的影像,編號為 2.0


  • 代表目前開啟兩張影像檔(雖然是相同的檔案),有兩個影像物件。


取得欲作用的圖層 id
  • JPEG 檔只有一個圖層。
  • 在 Script-Fu Console 的文字輸入框內
    • 鍵入 (define drw (gimp-image-get-active-layer 1))
    • 就可將取得「 影像 id 為 1」 的「 active 圖層 id」
  • active 是指目前選到的、會發生作用的、會發生作用的圖層。


用視窗介面開啟檔案,再用程式碼施加濾鏡效果
  • 通常,都是用視窗介面的選單,來執行濾鏡的功能,以此,施加濾鏡效果。
  • 在此示範,用 Script-Fu Code 連續施加兩種濾鏡的效果。
  • 開啟測試的圖檔,假設受作用的影像其 id 為 1 。
  • 將下列的程式碼,複製後,貼入 Script-Fu Console 輸入框 。
  • 按下 Enter 鍵,就會看到結果圖,如下所示。

(define img 1) ;
(define drw (car (gimp-image-get-active-layer img)))
(define blur-radius 10)
(define cell-size 10)
(plug-in-gauss-iir RUN-NONINTERACTIVE img drw blur-radius 1 1)
(plug-in-newsprint RUN-NONINTERACTIVE img drw cell-size 0 0 45.0 3 45.0 0 45.0 0 45.0 0 3)