[Part I. GIMP基礎功]

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

26.6 島嶼圖,修改成可「單行」執行的 Script-Fu

修改成一行一行可執行的程式碼
  • 本節要將 land.scm 修改成在 Console 內可一行一行執行的 Scheme 程式碼。
  • land.scm 完整的程式碼可參考 26.5 節
  • 也可到 GIMP 系統的 scripts 目錄下找到該檔案。
  • 最主要修改的部份是,將「對話框接收輸入變數值」修改成「直接指定輸入變數值」。
  • 先要瞭解,land.scm 程式碼的執行流程。


最主要修改的部份
  • 不使用 let* 改用 define
  • 原本的程式使用 let* 定義與指定區域變數值。
  • (let* (()()()...) ()() ...) 這樣的語法括號太多。
  • 若要一行一行分析程式碼的意義,let* 語法,括號有好幾層,分析時,會造成一些干擾。
  • 現在不使用 let* 改用 define 來定義與指定變數值。


捨棄函數 script-fu-land,直接指定輸入變數值
  • 修改成最多的地方就是下列這兩段部份。
  • (while (condition) (expr1) (expr2) .......),要注意此區塊括號的對齊。
  • 記得要刪除多餘的右括號 ) ,不然會出現錯誤訊息。
  • 修改後的程式碼,不再需要預先定義函數 script-fu-land ,但是要預先設定變數名稱、變數值 。

(define (script-fu-land width height seed detail landheight seadepth xscale yscale gradient)
(let* (
  (img (car (gimp-image-new width height RGB)))
  (layer-one (car (gimp-layer-new img width height
                                  RGB-IMAGE "Bottom" 100 NORMAL-MODE)))
  (layer-two 0)
  )


從下列的程式碼得知變數值的型態與大小
SF-ADJUSTMENT _"Image width"  '(256 10 1000 1 10 0 1)
SF-ADJUSTMENT _"Image height" '(256 10 1000 1 10 0 1)
SF-ADJUSTMENT _"Random seed"  '(32 0 15000000 1 10 0 1)
SF-ADJUSTMENT _"Detail level" '(4 1 15 1 5 0 0)
SF-ADJUSTMENT _"Land height"  '(60 1 65 1 10 0 1)
SF-ADJUSTMENT _"Sea depth"    '(4 1 65 1 10 0 1)
SF-ADJUSTMENT _"Scale X"      '(4 0.1 16 1 5 0.1 0)
SF-ADJUSTMENT _"Scale Y"      '(4 0.1 16 1 5 0.1 0)
SF-GRADIENT   _"Gradient"     "Land 1"


修改後的程式碼,與測試的結果圖
  • 下面是修改後的程式碼。
  • 啟動 GIMP Script-fu Console
  • 將下面的 Scheme 程式碼,全部選取、複製、再貼入 GIMP Script-fu Console 文字框,按下 Enter 。
  • 過一會,就會看到結果圖。


(define width 256 )
(define height 256 )
(define seed 32 )
(define detail 4 )
(define landheight 60 )
(define seadepth 4 )
(define xscale 4 )
(define yscale 4 )
(define gradient "Land 1")

(define img (car (gimp-image-new width height RGB)))
(define layer-one (car (gimp-layer-new img width height RGB-IMAGE "Bottom" 100 NORMAL-MODE)))
(define layer-two 0)

(gimp-context-set-gradient gradient)
(gimp-image-undo-disable img)
(gimp-image-add-layer img layer-one 0)

(plug-in-solid-noise RUN-NONINTERACTIVE img layer-one TRUE FALSE seed detail xscale yscale)
(plug-in-c-astretch RUN-NONINTERACTIVE img layer-one)
(set! layer-two (car (gimp-layer-copy layer-one TRUE)))
(gimp-image-add-layer img layer-two -1)
(gimp-image-set-active-layer img layer-two)

(plug-in-gradmap RUN-NONINTERACTIVE img layer-two)



(gimp-by-color-select layer-one '(190 190 190) 55 CHANNEL-OP-REPLACE FALSE FALSE 0 FALSE)
(plug-in-bump-map RUN-NONINTERACTIVE img layer-two layer-one 135.0 35 landheight 0 0 0 0 TRUE FALSE 0)

;(plug-in-c-astretch RUN-NONINTERACTIVE img layer-two)
(gimp-selection-invert img)
(plug-in-bump-map RUN-NONINTERACTIVE img layer-two layer-one 135.0 35 seadepth 0 0 0 0 TRUE FALSE 0)

;(plug-in-c-astretch RUN-NONINTERACTIVE img layer-two)

; uncomment the next line if you want to keep a selection of the "land"
(gimp-selection-none img)

(gimp-display-new img)
(gimp-image-undo-enable img)