從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
用文字工具 |
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工具 |
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
使用顏料桶工具 |
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
設前景色為白色,此時背景色為黑色,使用漸層填色工具 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參數設定對話盒這樣設定。 |