[Part I. GIMP基礎功]

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



8.12 火燄效果 Python code

將火燄效果作用在物體的剪影上
  • 只要能替物體去除背景,就能得到物體輪廓的剪影。
  • 物體輪廓的剪影,妙用無窮,最主要,還是用來凸顯主體本身。
  • 接續前一節,以下示範火燄效果,原理是利用長頸鹿的剪影,製作出灰階的外燄、灰階的內燄。



載入「長頸鹿」的圖片,有很多方法
  • 載入的圖片,之後,是要透過 Python Code 來潤飾影像。
    • a. 可以手動下載本網頁上的「長頸鹿」圖片,而後,透過 GIMP 圖形介面,載入「長頸鹿」的圖片。
    • b. 也可,完全用 Python Code 下載並載入 lemmling_Cartoon_giraffe.png
  • 方法 a. 使用 GIMP 圖形介面,找到圖檔 lemmling_Cartoon_giraffe.png,而後,載入到影像視窗內。接著,透過 Python Code 設定影像物件的變數。

img_array = gimp.image_list()
img = img_array[0] # 必須確定此為「最新載入的影像」
drw_backup = pdb.gimp_image_get_active_layer(img)

  • 方法 b. 直接透過 file_uri_load ,載入網路上的圖檔到影像視窗內。

file_uri = "https://lh5.googleusercontent.com/-S0CTFq_z05Y/Tx4p8wa75UI/AAAAAAAAFo8/pN4FxCwxKnY/s512/lemmling_Cartoon_giraffe.png"
img = pdb.file_uri_load(file_uri, file_uri)
drw_backup = pdb.gimp_image_get_active_layer(img)
pdb.gimp_drawable_set_name(drw_backup, "Giraffe Original")
pdb.gimp_display_new(img)

  • 啟動 GIMP Python Console
  • 前面兩種方式都可載入「長頸鹿」圖片。
  • 將前面的程式碼,選取、複製、再貼到 Python Console 提示符號 >>> 之後,按下 Enter 。
  • 過一會,就會看到新的影像視窗,內有「長頸鹿」圖片。
  • 下圖只呈現「長頸鹿」圖片。

長頸鹿,圖片來源OpenClipArt


等價的 Python-Fu 程式碼
  • 接續前一節的練習操作,改用 Python-Fu 自動化字體的生成流程。
  • 下面的程式碼,分成七大部份:
    1. 首先,要準備好新的影像、新的圖層。
    2. 產生純色的長頸鹿的剪影
    3. 灰階的外燄
    4. 灰階的內燄
    5. 產生火燄的效果
    6. 漸層效果 + 立體效果(此部份,也可省略不做)
    7. 調整圖層的結構,與顯示的順序

# Part 1.
# 載入圖片有很多方法

# 方法 a. 使用 GIMP 圖形介面,找到圖檔,而後,載入到影像視窗內。
# img_array = gimp.image_list()
# img = img_array[0] # 必須確定此為「最新載入的影像」
# drw_backup = pdb.gimp_image_get_active_layer(img)

# 方法 b. 直接透過網路,使用 file_uri_load ,載入圖檔到影像視窗內。
# 長頸鹿
file_uri = "https://lh5.googleusercontent.com/-S0CTFq_z05Y/Tx4p8wa75UI/AAAAAAAAFo8/pN4FxCwxKnY/s512/lemmling_Cartoon_giraffe.png"
# GIMP 吉祥物 Wilber
#file_uri = "https://lh4.googleusercontent.com/-5_NlDPkjSyo/TyNj5O2QpsI/AAAAAAAAFto/pihKuG_AeWI/s512/wilber_work.png"
img = pdb.file_uri_load(file_uri, file_uri)
drw_backup = pdb.gimp_image_get_active_layer(img)
pdb.gimp_drawable_set_name(drw_backup, "Giraffe Original")
pdb.gimp_display_new(img)

# 圖片的尺寸
width = pdb.gimp_image_width(img)
height = pdb.gimp_image_height(img)

# 前景色設為黑色,背景色設為白色
black = (0, 0, 0)
white = (255, 255, 255)
# 前景色設為紅色,背景色設為黃色
red = (255, 0, 0)
yellow =  (255, 255, 0)

bg_layer = pdb.gimp_layer_new(img, width, height, RGB_IMAGE, "Black BG with Fire", 100, NORMAL_MODE)
pdb.gimp_image_add_layer(img, bg_layer, 0)
pdb.gimp_context_set_foreground(black)
pdb.gimp_edit_fill(layer, FOREGROUND_FILL) 


# Part 2.
logo_backup = pdb.gimp_layer_copy(drw_backup, TRUE)
pdb.gimp_image_add_layer(img, logo_backup, -1)
pdb.gimp_drawable_set_name(logo_backup, "Logo Backup")
pdb.gimp_selection_layer_alpha(logo_backup)
pdb.gimp_context_set_foreground(white)
pdb.gimp_edit_fill(logo_backup, FOREGROUND_FILL)
pdb.gimp_selection_none(img)


# Part 3.
# 灰階的外燄
fire_outer1 = pdb.gimp_layer_copy(logo_backup, TRUE)
pdb.gimp_image_add_layer(img, fire_outer1, -1)

pdb.gimp_selection_layer_alpha(fire_outer1)

pdb.gimp_selection_grow(img, 2)
pdb.gimp_context_set_foreground(white)
pdb.gimp_edit_fill(fire_outer1, FOREGROUND_FILL)
pdb.gimp_selection_none(img)

fire_outer2 = pdb.gimp_layer_copy(fire_outer1, TRUE)
pdb.gimp_image_add_layer(img, fire_outer2, -1)

blur_radius = 10
pdb.plug_in_gauss_iir(img, fire_outer1, blur_radius, 1, 1)
shift_amount = 50
orientation = 0
pdb.plug_in_shift(img, fire_outer1, shift_amount, orientation)

fire_outer1 = pdb.gimp_image_merge_down(img, fire_outer2, EXPAND_AS_NECESSARY)

pdb.plug_in_shift(img, fire_outer1, shift_amount, orientation)

amplitude = 10
phase = 0
wavelength = 30
#wavelength = 50
pdb.plug_in_waves(img, fire_outer1, amplitude, phase, wavelength, 0, FALSE)

pdb.gimp_rect_select(img, 0, (height*2/3), (width-1), (height-1), 0, TRUE, 4)
pdb.gimp_edit_clear(fire_outer1)
pdb.gimp_selection_none(img)

blur_radius = 10
pdb.plug_in_gauss_iir(img, fire_outer1, blur_radius, 1, 1)

fire_outer2 = pdb.gimp_layer_copy(fire_outer1, TRUE)
pdb.gimp_image_add_layer(img, fire_outer2, -1)
fire_outer = pdb.gimp_image_merge_down(img, fire_outer2, EXPAND_AS_NECESSARY)
pdb.gimp_drawable_set_name(fire_outer, "Fire Outer Layer")

pdb.gimp_layer_set_visible(logo_backup, FALSE)


# Part 4.
# 灰階的內燄
fire_inner = pdb.gimp_layer_copy(logo_backup, TRUE)
pdb.gimp_image_add_layer(img, fire_inner, -1)
pdb.gimp_drawable_set_name(fire_inner, "Fire Inner Layer")

pdb.gimp_selection_layer_alpha(fire_inner)

pdb.gimp_selection_grow(img, 2)

pdb.gimp_context_set_foreground(white)
pdb.gimp_edit_fill(fire_inner, FOREGROUND_FILL)

pdb.gimp_selection_none(img)

blur_radius = 10
pdb.plug_in_gauss_iir(img, fire_inner, blur_radius, 1, 1)


# Part 5.
# 合併外燄、內燄、黑色背景
# 漸層換色,產生火燄的效果
fire_layer = pdb.gimp_image_merge_down(img, fire_inner, EXPAND_AS_NECESSARY)
bg_layer = pdb.gimp_image_merge_down(img, fire_layer, EXPAND_AS_NECESSARY)

pdb.gimp_drawable_set_name(bg_layer, "Black BG with Fire")

gradient = "German flag smooth"
pdb.gimp_context_set_gradient(gradient)
pdb.plug_in_gradmap(img, bg_layer)


# Part 6.
# 漸層效果 + 立體效果
pdb.gimp_layer_set_visible(logo_backup, TRUE)

logo_layer = pdb.gimp_layer_copy(logo_backup, TRUE)
pdb.gimp_image_add_layer(img, logo_layer, -1)
pdb.gimp_drawable_set_name(logo_layer, "Gradient Effect Logo")

pdb.gimp_layer_set_lock_alpha(logo_layer, TRUE)
pdb.gimp_context_set_foreground(yellow)
pdb.gimp_context_set_background(red)

offset =0 ;repeat = REPEAT_NONE;reverse = FALSE;
supersample = FALSE ; max_depth = 0 ; threshold = 0;
dither = TRUE ;

x1 = 0; y1 = height/2; x2 = width; y2 = height/2 # 相當於由左至右拉一條直線

pdb.gimp_blend(logo_layer,  FG_BG_RGB_MODE, NORMAL_MODE, GRADIENT_LINEAR, 100, offset, repeat, reverse, supersample, max_depth, threshold, dither, x1, y1, x2, y2)
#
pdb.plug_in_bump_map(img, logo_layer, logo_layer, 135.0, 35, 3, 0, 0, 0, 0, TRUE, FALSE, 0)


# Part 7.
# 讓「長頸鹿」圖案顯示在最上方的圖層
# 讓「火燄效果 」烘托「長頸鹿」圖案
pdb.gimp_image_raise_layer_to_top(img, drw_backup)

pdb.gimp_layer_set_visible(logo_backup, FALSE)

pdb.gimp_layer_set_visible(logo_layer, FALSE)

  • 啟動 GIMP Python Console
  • 將前面的程式碼,依次序,全部選取、複製、再貼到 Python Console 提示符號 >>> 之後,按下 Enter 。
  • 過一會,就會看到火燄效果,與其圖層結構,如下圖所示。




將火燄效果作用其它的影像上

  • Wilber 是 GIMP 的吉祥物。
  • 圖片來源 GIMP 官方網站 Wilber, the GIMP mascot
  • 原圖是 PNG 格式,背景為透明。
  • 擴張原圖外圍的透明區域,讓外圍有足夠的空間可以施加火燄效果。
  • 使用前面的程式碼,修改 file_uri = "......" 直接透過網路,載入圖檔到影像視窗內。
  • 還要修改 amplitude 與 wavelength

file_uri = "https://lh4.googleusercontent.com/-5_NlDPkjSyo/TyNj5O2QpsI/AAAAAAAAFto/pihKuG_AeWI/s512/wilber_work.png"
amplitude = 5
wavelength = 20

  • 火燄效果如下圖所示。