從script_fu中學習影像處理技巧:陰影字

 

        scripts目錄下有超過100個 *.scm檔,這些是學習影像處理技巧的最好教材。Script_fu主要分兩類,一類是作用在既有的影像與圖層上,由執行[image] -> Script_Fu -> 下產生的浮動選單所啟動,另一類Script_fu由工具盒上的Xtns -> Script_Fu選單所啟動,執行後產生一個新的影像視窗顯示結果。

        陰影字是文字變化中一個常用的技巧,[GIMP] -> Xtns -> Script_Fu -> Logos -> 浮動選單內有許多文字效果可補足文字工具的不足,這些Script-Fu程式產生的文字效果很多都用了陰影效果,Basic I這個Script-Fu程式算是當中程式碼較短的一個,以下我們來研究Spencer Kimball所寫的basic1-logo.scm程式。

 

一、執行Script-Fu

陰影字

 

陰影字需要3個圖層

 

l          執行[GIMP] -> Xtns -> Script_Fu -> Logos -> Basic I 產生一陰影字。

l          陰影字需要3個圖層:文字部分、黑色陰影、白色背景。

 

        使用Gimp圖形界面來編輯影像的每個動作都有相對應的函數,gimp-edit-copy、gimp-edit-paste、gimp-edit-cut對應的便是最常使用的影像複製、影像貼上、影像剪下等動作。

以下我們使用Gimp圖形界面,一步一步作來產生陰影字。藉由這過程來體會程式碼的意思。

 

二、使用Gimp圖形界面,一步一步作

每個步驟所產生的影像視窗與圖層視窗

以圖形使用者界面產生陰影字,需要的步驟:

對應到basic1-logo.scm程式碼中的函數

在透明層寫上Gimp

l          執行[GIMP] -> File -> New,產生大小256x256透明底色的影像。

l          用文字工具寫上Gimp,此時只有一個圖層,將此圖層更名為Gimp(與你所寫在的文字相同)。

 

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

42: (gimp-image-undo-disable img)

43: (gimp-layer-set-name text-layer text)

44: (apply-basic1-logo-effect img text-layer bg-color text-color)

調整影像大小

l          使用Crop工具將Gimp圖層調成適當大小。

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

產生2個圖層

l          在操作圖層的對話盒中,產生2個新的圖層,一個名為Background圖層,一個名為Shadow圖層,Shadow圖層的圖層重疊模式為MULTIPLY(burn)燒黑模式。

l          位於下面的圖層設定不同的混色模式無法影響下面的圖層。Shadow圖層設MULTIPLY模式,無法影響到Gimp圖層。

l          3個圖層由上到下的排列順序為:Gimp、Shadow、Background。

10::(bg-layer (car (gimp-layer-new img width height RGBA_IMAGE "Background" 100 NORMAL)))

11:(shadow-layer (car (gimp-layer-new img width height RGBA_IMAGE "Shadow" 100 MULTIPLY)))

15: (gimp-image-add-layer img shadow-layer 1)

17: (gimp-image-add-layer img bg-layer 2)

為Gimp著色

l          將前景顏色設為藍色。

l          將Gimp圖層的Keep Trans的狀態按鈕按下。

l          使用顏料桶工具用前景色將Gimp圖層上色。底色透明的部分不會被上色,文字部份變為藍色。

18: (gimp-palette-set-foreground text-color)

19: (gimp-layer-set-preserve-trans logo-layer TRUE)

20: (gimp-edit-fill logo-layer FG-IMAGE-FILL)

將底色變白色

l          將前景顏色設為白色。

l          使用顏料桶工具用背景色將Background圖層由透明變為白色。

21: (gimp-palette-set-background bg-color)

22: (gimp-edit-fill bg-layer BG-IMAGE-FILL)

 

Alpha to Select選取文字部份

l          執行[image] -> Edit -> Clear,確定Shadow圖層目前是全透明的。

l          在操作圖層的對話盒中,點選Gimp圖層按滑鼠右鍵出現一選單執行Alpha to Select,此時Gimp字樣出現一個被選取的虛線外框。

23: (gimp-edit-clear shadow-layer)

24: (gimp-selection-layer-alpha logo-layer)

製作陰影

l          將背景顏色設為黑色。

l          點選Shadow圖層,點選影像視窗,執行[image] -> Select -> Feather將選取區域羽化7.5個像素。

l          將選取的區域使用顏料桶工具填上背景顏色。

l          由於羽化選取區域的因素,使得字的邊緣變模糊。

25Lgimp-palette-set-background ‘(0 0 0))

26: (gimp-selection-feather img 7.5)

27: (gimp-edit-fill shadow-layer BG-IMAGE-FILL)

大功告成

l          取消選取區域。

l          設前景色為白色,此時背景色為黑色,使用漸層填色工具,混合模式為MULTIPLY,從左上角到右下角拉一條線。左上角白色與藍色以燒黑模式混合仍維持藍色,右下角黑色與藍色以燒黑模式混合變黑色。

l          對Shadow圖層,執行[image] -> Transforms -> Offset,將Shadow圖層往下往左都移動3個像素。

l          MULTIPLY模式的原理:將兩種顏色相乘(A×B÷255),因此出現的結果多較原色彩深。任何色彩和黑色相加成均變為黑色,因為黑色為0,任何數乘0都變0;任何色彩和白色相加成均維持原色,因為白色為255,任何數乘255再除255維持不變。

28:(gimp-selection-none img)

29: (gimp-palette-set-foreground '(255 255 255))

30: (gimp-blend logo-layer FG-BG-RGB MULTIPLY RADIAL 100 20 REPEAT-NONE FALSE 0 0 0 0 width height)

31: (gimp-layer-translate shadow-layer 3 3)

 

三、原始程式碼:

l          原程式碼basic1-logo.scm中,(define (script-fu-basic1-logo-alpha)與(script-fu-register "script-fu-basic1-logo-alpha")這兩部份宣告並註冊一個作用在影像的Script_fu函數,在本文中用不到,故在下面的原始碼中我將它們刪除。

l          程式碼分三部份

l          4~33行:(define (apply-basic1-logo-effect  ))

l          35~47行::(define (script-fu-basic1-logo   )) ,使用apply-basic1-logo-effect函數產生陰影字

l          48~59行:(script-fu-register "script-fu-basic1-logo"  )

 

 

 

 

1:  ;  DROP-SHADOW-LOGO

2:  ;  draw the specified text over a background with a drop shadow

3:

4:  (define (apply-basic1-logo-effect img

5:                                    logo-layer

6:                               bg-color

7:                               text-color)

8:       (let* ((width (car (gimp-drawable-width logo-layer)))

9:                 (height (car (gimp-drawable-height logo-layer)))

10:          (bg-layer (car (gimp-layer-new img width height RGBA_IMAGE "Background" 100 NORMAL)))

11:           (shadow-layer (car (gimp-layer-new img width height RGBA_IMAGE "Shadow" 100 MULTIPLY)))

12:        (old-fg (car (gimp-palette-get-foreground)))

13:        (old-bg (car (gimp-palette-get-background))))

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

15:          (gimp-image-add-layer img shadow-layer 1)

17:          (gimp-image-add-layer img bg-layer 2)

18:          (gimp-palette-set-foreground text-color)

19:          (gimp-layer-set-preserve-trans logo-layer TRUE)

20:          (gimp-edit-fill logo-layer FG-IMAGE-FILL)

21:          (gimp-palette-set-background bg-color)

22:          (gimp-edit-fill bg-layer BG-IMAGE-FILL)

23:          (gimp-edit-clear shadow-layer)

24:          (gimp-selection-layer-alpha logo-layer)

25:          (gimp-palette-set-background '(0 0 0))

26:          (gimp-selection-feather img 7.5)

27:          (gimp-edit-fill shadow-layer BG-IMAGE-FILL)

28:          (gimp-selection-none img)

29:          (gimp-palette-set-foreground '(255 255 255))

30:          (gimp-blend logo-layer FG-BG-RGB MULTIPLY RADIAL 100 20 REPEAT-NONE FALSE 0 0 0 0 width height)

31:          (gimp-layer-translate shadow-layer 3 3)

32:          (gimp-palette-set-background old-bg)

33:          (gimp-palette-set-foreground old-fg)))

34:

 

35:    (define (script-fu-basic1-logo text

36:                     size

37:                   font

38:                          bg-color

39:                          text-color)

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

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

42:              (gimp-image-undo-disable img)

43:              (gimp-layer-set-name text-layer text)

44:              (apply-basic1-logo-effect img text-layer bg-color text-color)

45:              (gimp-image-undo-enable img)

46:              (gimp-display-new img)))

47:

 

48:    (script-fu-register "script-fu-basic1-logo"

49:               _"<Toolbox>/Xtns/Script-Fu/Logos/Basic I..."

50:               "Creates a simple logo with a drop shadow"

51:               "Spencer Kimball"

52:               "Spencer Kimball"

53:               "1996"

54:               ""

55:               SF-STRING     _"Text" "The Gimp"

56:               SF-ADJUSTMENT _"Font Size (pixels)" '(100 2 1000 1 10 0 1)

57:               SF-FONT       _"Font" "-*-Dragonwick-*-r-*-*-24-*-*-*-p-*-*-*"

58:               SF-COLOR      _"Background Color" '(255 255 255)

59:               SF-COLOR      _"Text Color" '(6 6 206))

l          由參數輸入對話盒可明白script-fu-register函數中參數的意思。

 

四、其它函數的說明:

gimp-blend

30: (gimp-blend logo-layer FG-BG-RGB MULTIPLY RADIAL 100 20 REPEAT-NONE FALSE 0 0 0 0 width height)

由DB Browser對話盒的資料可推出第30行是什麼意思。

 

Blend參數設定對話盒

l          30: (gimp-blend logo-layer FG-BG-RGB MULTIPLY RADIAL 100 20 REPEAT-NONE FALSE 0 0 0 0 width height)

l          gimp-blend函數所輸入的參數,相當於上圖Blend Tools Options參數設定對話盒這樣設定。