一個最簡單的Script_Fu:hi.scm

 

程式的主要架構

l          本程式hi.scm修改自slime.scm,刪去大部分程式碼。

l          執行[Gimp] -> Xtrns -> Script-Fu -> hi會產生右圖

l          程式主要由兩部份所主組成:

    1到13行:以define函數定義script-fu-hi函數。

    15到26行:以script-fu-register函數向資料庫註冊函數。

hi.scm執行結果

 

l          以gimp-text-fontname函數寫上Hi!

l          以gimp-image-resize函數將影像改為適當大小。

1:  (define (script-fu-hi text size font)

2:     (let* ((img (car (gimp-image-new 256 256 RGB)))

3:          (text-layer (car (gimp-text-fontname img -1 0 0 text 30 TRUE size PIXELS font)))

4:          (width (car (gimp-drawable-width text-layer)))

5:          (height (car (gimp-drawable-height text-layer)))

6:          )

7:          ;; Resize the image

8:           (gimp-image-resize img width height 0 0)

9:

10:        ;; display

11:        (gimp-display-new img)

12:     )

13:   )

14:

注意括號成對

l          1到13行:以define函數定義script-fu-hi函數。故第1行的第1個左括號與第13行的右括號成對。

l          15到26行:以script-fu-register函數向資料庫註冊script-fu-hi函數。故第15行的第1個左括號與第26行的右括號成對。

l          2到12行:以let*函數宣告區域變數並使用它。故第2行的第1個左括號與第12行的右括號成對。

l          2到6行:宣告區域變數,由於let*函數語法:(let* (variables) expressions),故第2行的第2個左括號與第6行的右括號成對。

l          若你自己寫Scheme的程式,必須注意括號的成對,這是最容易出錯的地方。

15:   (script-fu-register "script-fu-hi"

16:                 "<Toolbox>/Xtns/Script-Fu/hi"

17:                 "Say hi..."

18:

19:                 "Modified by Samuel Li (sclee@eagle.ee.ntu.edu.tw)"

20:                 "Jean-Philippe Turcat (cmrjpt@soc.staffs.ac.uk)"

21:                 "04/21/2001"

22:                 ""

23:                 SF-STRING "Text String" "Hi!"

24:                 SF-ADJUSTMENT "Font Size (pixels)" '(72 2 1000 1 10 0 1)

25:                 SF-FONT "Font" "-*-ComicsCarToon-*-r-*-*-24-*-*-*-p-*-*-*"

26:   )

選單在那裡?

l          第16行:<Toolbox>表示這是一個不必有影像視窗就可執行的Script_Fu,相對於<Image>。<Toolbox>表示這Script_Fu程式在Gimp工具盒中的Xtrns選單的子選單中。

l          <Image>表示點一下影像視窗按滑鼠右鍵出現一選單,Script_Fu程式在這選單的子選單中。

 

script-fu-register函數的前7個參數:

1

Name

你所要註冊的函數名稱,不能與已註冊的函數同名。

Hi.scm所註冊的函數名稱為

"script-fu-hi"

2

Location

選單所在的位置。

"<Toolbox>/Xtns/Script-Fu/hi"

3

Description

以一段文字描述你的script的功能。

"Say hi..."

4

Author

script的作者的姓名。

"Modified by Samuel Li "

5

Copyright

版權宣告。

"Jean-Philippe Turcat "

6

Date

Script程式最後一版的寫作完成日期。

"04/21/2001"

7

Type

這個Script程式所處理的影像的色彩模式,色彩模式有RGB、RGBA、GRAY、INDEXED、INDEXEDA。

""

hi.scm自己會產生一個影像物件,故這個參數為空白值。

 

About對話盒

About對話盒

l          17到21行:在Script-Fu:hi的About對話盒內有對應的資料。

l          相當於script-fu-register函數第3、4、5、6個參數。

 

script-fu-register函數的第8個參數與之後的參數

第8個參數與之後的參數,不限定個數,是用來設定參數輸入對話盒內的參數。參數輸入對話盒內的資料最後由註冊函數(第1個參數)所接收,作為註冊函數的輸入變數。

第8個參數與之後的參數其設定的格式為:Param-type "Prompt text" "default value",(參數型態 "提示文字" "預設值")。參數型態暗示了註冊函數的輸入變數的變數型態。

 

參數輸入對話盒

l          23到25行:在Script-Fu:hi的參數輸入對話盒內有對應的資料。

l          相當於script-fu-register函數第8、9、10個參數。

23行:SF-STRING "Text String" "Hi!"

l          SF-STRING,表示會在參數輸入對話盒上產生一個字串的文字輸入框。

l          "Text String",為輔助說明的文字。

l          "Gimp",表文字輸入框內預設的字串為Gimp。

24行:SF-ADJUSTMENT "Font Size (pixels)" '(72 2 1000 1 10 0 1)

l          SF-ADJUSTMENT,在對話盒上產生一個可上下調整大小值的控制元件。

l          "Font Size (pixels)",為輔助說明的文字。

l          '(72 2 1000 1 10 0 1),字形大小預設值72、最小值2、最大值1000、每次調整控制元件增加值1。

25行:SF-FONT "Font" "-*-ComicsCarToon-*-r-*-*-24-*-*-*-p-*-*-*")

l          SF-FONT,在對話盒上產生一個字型設定按鈕,按下按鈕可啟動設定字型的對話盒。

l          "Font",為輔助說明的文字。

l          "-*-ComicsCarToon-*-r-*-*-24-*-*-*-p-*-*-*"),為預設字型,Gimp的字型是使用X11的格式。

第1行:(define (script-fu-hi text size font)

藉由對話盒所輸入的參數,設定script-fu-hi函式的text、size、font這三個變數。

OK按鈕:

按下對話盒的OK按鈕後,OK按鈕下方的文字顯示框內的文字會快速改變,此時script-fu-hi函數被呼叫,傳入變數設定,hi.scm從第1行執行到第13行。

第32行:(gimp-display-new img)

秀出最後的結果,透明底色的Hi!。

 

1

Name

你所要註冊的函數名稱,不能與已註冊的函數同名。

Hi.scm所註冊的函數名稱為

"script-fu-hi"

2

Location

選單所在的位置。

"<Toolbox>/Xtns/Script-Fu/hi"

3

Description

以一段文字描述你的script的功能。

"Say hi..."

4

Author

script的作者的姓名。

"Modified by Samuel Li "

5

Copyright

版權宣告。

"Jean-Philippe Turcat "

6

Date

Script程式最後一版的寫作完成日期。

"04/21/2001"

7

Type

這個Script程式所處理的影像的色彩模式,色彩模式有RGB、RGBA、GRAY、INDEXED、INDEXEDA。

""

hi.scm自己會產生一個影像物件,故這個參數為空白值。

 

2行到11行:

l          2: (let* ((img (car (gimp-image-new 256 256 RGB)))

產生新影像大小為256x256、RGB模式,將新影像存在img變數內。

l          3:(text-layer (car (gimp-text-fontname img -1 0 0 text 30 TRUE size PIXELS font)))

    產生新文字圖層,將新文字圖層存在text-layer變數內。

l          4: (width (car (gimp-drawable-width text-layer)))

使用gimp-drawable-width得到文字圖層的寬度並存在width變數內。

l          5: (height (car (gimp-drawable-height text-layer) ))

    使用gimp-drawable-height得到文字圖層的高度存在height變數內。

l          8: (gimp-image-resize img width height 0 0)

將影像改為適當大小。

l          11: (gimp-display-new img)

產生一影像視窗,秀出圖片來。

 

DB Browser內的資料:

在本文中,許多函數的功能沒有解釋清楚,函數的參數如何設定完全沒有解釋。一切的答案都在DB Browser內。

有些東西請多思考,自行領會。

l          2: (let* ((img (car (gimp-image-new 256 256 RGB)))

產生影像物件並不能馬上使用gimp-display-new來顯示影像,影像物件一定要有圖層才能有東西可顯示。

gimp-layer-new可產生圖層。

 

l          3:(text-layer (car (gimp-text-fontname img -1 0 0 text 30 TRUE size PIXELS font)))

Gimp的字型是使用X11的格式。

 

l          4: (width (car (gimp-drawable-width text-layer)))

 

什麼是drawable?

就是圖層。

一個影像可由多個圖層組成,現在被選到的,可在其上作運算的圖層稱為drawable。

 

l          5: (height (car (gimp-drawable-height text-layer) ))

 

 

l          8: (gimp-image-resize img width height 0 0)

 

 

l          11: (gimp-display-new img)

開一個新視窗來顯示影像。