[Part I. GIMP基礎功]

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

13.6 Python-Fu Code 與 GIMP 介面視窗之互動

你可以混合 Python-Fu Code 與介面視窗的操作
  • 互動,意指一部分操作 GIMP 介面視窗,一部分由 Python-Fu Code 完成。
  • 接續前節,改用 Python-Fu Code 來說明。
  • 半自動化的操作方式,連續施加兩種濾鏡的效果。


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


Python 最重要的資料結構是 list
  • Python 最重要的資料結構 list 。
  • Python 的 list 類似於 C 的 array ,從都透過索引值來讀寫內容。
  • Python list 資料索引值是從 0 開始增加的 。


要會區別「影像 id」與「影像 reference」
  • Script-Fu 用物件的 id , 控制物件的操作, id 為流水號,從 1 開始編號 。
  • Python-Fu 用物件的 reference , 控制物件的操作。
  • Python 的變數名稱,就代表了物件的 reference 。
  • Python-Fu 之中,要取得影像視窗的控制權,不能透過 id 影像,而是要透過影像物件的 reference 。
img_array = gimp.image_list()
img = img_array[0]
drw = pdb.gimp_image_get_active_layer(img)
  • gimp.image_list() 回傳一個 list ,內含目前所有的影像物件的 reference 。
  • img = img_array[0] 將最新的影像物件的 reference 儲存在 img 變數。



取得視窗所承載的影像 id
  • 以簡單的方形黑色塊,觀察影像物件的 reference 。

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

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

>>> gimp.image_list()
[<gimp.Image 'test_square_.jpg'>, <gimp.Image 'test_square_.jpg'>]
>>> img_array = gimp.image_list()
>>> img_array[0]
<gimp.Image 'test_square_.jpg'>
>>> img_array[1]
<gimp.Image 'test_square_.jpg'>

  • 代表目前開啟兩張影像檔,雖然是相同的檔案 test_square_.jpg
  • 有兩個影像物件 img_array[0] 與 img_array[1]


取得欲作用的圖層 id
  • JPEG 檔只有一個圖層。
  • 先確定 img_array[0] 代表那張影像檔。
  • 在 Python Console 的提示符號 >>> 之後,鍵入
img_array = gimp.image_list()
img = img_array[0]
drw = pdb.gimp_image_get_active_layer(img)
  • 就可將取得「 active 圖層的 reference」
  • active 是指目前選到的、會發生作用的、會發生作用的圖層。


用視窗介面開啟檔案,再用程式碼施加濾鏡效果
  • 通常,都是用視窗介面的選單,來執行濾鏡的功能,以此,施加濾鏡效果。
  • 在此示範,用 Python-Fu Code 連續施加兩種濾鏡的效果。
  • 開啟測試的圖檔,假設它是最新開啟的圖檔 。
  • 將下列的程式碼,複製後,再貼到 GIMP Python Console 提示符號 >>> 之後。
  • 按下 Enter 鍵,就會看到結果圖,如下所示。

img_array = gimp.image_list()
img = img_array[0]
drw = pdb.gimp_image_get_active_layer(img)
blur_radius = 10
cell_size = 10

pdb.plug_in_gauss_iir(img, drw, blur_radius, 1, 1)
pdb.plug_in_newsprint(img, drw, cell_size, 0, 0, 45.0, 3, 45.0, 0, 45.0, 0, 45.0, 0, 3)