[Part I. GIMP基礎功]

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

14.2 Scheme 與 Python 函式呼叫的差異

由程序資料庫 Procedure Database 查詢函數的用法
  • Script-Fu Console 與 Python-Fu Console ,訊息視窗的右下方「瀏覽 Browse」的按鈕,可快速存取程序資料庫 Procedure Database 。

  • 如果你已經精通 Scheme 語言、Python 語言,實務上,撰寫 Script-Fu 、Python-Fu ,要下最多功夫的,就是查詢函數的用法
  • 也就是,你經常要啟動程序資料庫 Procedure Database 對話盒。


舉幾個 Script-Fu 函數查詢的例子:
(gimp-image-list)
(gimp-image-new width height type)
(gimp-display-new image)
(gimp-layer-new image width height type name opacity mode)
  • 當函數參數很多時,使用時,一定會碰到問題。
  • 最好的解決方式,就是閱讀 Procedure Database 對話盒內輸入值與輸出值的說明。


舉幾個 Python-Fu 函數查詢的例子:
num_images, image_ids = pdb.gimp_image_list()
image = pdb.gimp_image_new(width, height, type)
display = pdb.gimp_display_new(image)
layer = pdb.gimp_layer_new(image, width, height, type, name, opacity, mode)


gimp-image-list 的陷阱
  • Scheme 的 (gimp-image-list) ,相當於,Python 的 pdb.gimp_image_list()
  • 但是 Python-Fu 不是用 id 來控制操作影像物件。
  • 因此,雖然有 pdb.gimp_image_list() 但這函數沒有實際的用途。
  • 取而代之,要使用 gimp.image_list()
  • 由於 Python 變數值的指派只要用等號 = ,同樣的函數,Python 函數就是比 Scheme 函數容易上手。
  • 只是因為語法本質上的差異,使用時,有些陷阱要小心。
  • Script-Fu 可以透過 id ,操作影像物件。
  • Python 之中,「變數名稱」只是「物件的 reference 」。
  • Python-Fu 則要透過「物件的 reference 」,操作影像物件。


gimp-image-list 的範例
  • 正確的 Script-Fu code 是基於「欲顯示的影像 id 為 1 」的假設

(define gradient "Land 1")
(gimp-context-set-gradient gradient)
(script-fu-flatland  256 256 80 3.0 4.0 4.0)
(define img 1) ; 影像 id 需要視"開啟多少影像"而定
(gimp-image-flatten img)

  • 錯誤訊息:錯誤訊息在引數「image」使用了無效的 ID 呼叫程序「gimp-image-flatten」。最有可能的是有增效模組嘗試處理已不存在的圖片。
  • 若出現錯誤訊息,就要根據影像視窗上方標題列顯示的數字,修改這一行的 img_id
(define img img_id)
  • 結果圖為,只有一個圖層的小島圖案,如下圖。

  • 正確的 Python-Fu code

pdb.gimp_context_set_gradient("Land 1")
pdb.script_fu_flatland(256, 256, 80, 3.0, 4.0, 4.0)
img_array = gimp.image_list()
img = img_array[0] # 假設最新的影像就是 flat land 這個影像
pdb.gimp_image_flatten(img)


濾鏡就是 plug-in ,函數名稱以 plug-in 開頭
  • 以下,以漸層換色、高斯模糊濾鏡為例。
  • Script-Fu code
(plug-in-gradmap run-mode image drawable)
(plug-in-gauss-iir run-mode image drawable radius horizontal vertical)
  • Python-Fu code
pdb.plug_in_gradmap(image, drawable)
pdb.plug_in_gauss_iir(image, drawable, radius, horizontal, vertical)


Scheme plug-in 函數改成 Python plug-in 函數的規則
  • 總結一句,就是省略 run-mode 參數

  • (plug-in-gradmap ......) 改成 pdb.plug_in_gradmap(......)
  • 原本 Scheme code 參數值的指派方式是
(plug-in-gradmap RUN-NONINTERACTIVE img drw)
  • Python code 函數 pdb.plug_in_gradmap 參數值的指派
    • 第1個參數不是 RUN_NONINTERACTIVE
    • 第1個參數是 img
    • 第2個參數是 drw
    • 第3個參數是關鍵字參數(Keyword parameter)的形式,因此,可有可無,因為預設已是 RUN_NONINTERACTIVE 。

  • Python code 函數 pdb.plug_in_gauss_iir 參數值的指派
    • pdb.plug_in_gauss_iir(img, drw, blur_radius, 1, 1, run_mode=RUN_INTERACTIVE)
    • run_mode = RUN_NONINTERACTIVE 是關鍵字參數(Keyword parameter)的形式,因此,可有可無,預設已是 RUN_NONINTERACTIVE 。
    • run_mode = RUN_INTERACTIVE,會出現濾鏡對話盒。
    • run_mode = RUN_NONINTERACTIVE,是預設的情況,不會出現濾鏡對話盒。