[Part I. GIMP基礎功]

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



15.8 混色工具的動態應用


讓人有暈眩的感覺。

混色工具,有許多種產生漸層的方法,有些並不常用,我使用螺旋(逆時針)與圓錐形(對稱)來產生這個動畫。


逆時針螺旋(ccw spiral)的漸層圖案
  • 新增256x256影像。
  • 在混色工具的選項面版內 【註1】 ,「形狀」項目設為螺旋(逆時針)(選單中的最後一個選項)。
  • 使用混色工具,從圖形的中心點向外拉一小條直線,線段的長度決定螺紋的疏密。
  • 執行[影像] / 色彩 / 界限值 【註2】 ,將旋轉式的漸層圖案變為黑白兩色的圖案。
  • 執行[影像] / 濾鏡 / 模糊化 / 高斯模糊 【註3】 ,模糊半徑設2。



圓錐狀(conical)的漸層圖案
  • 新增一圖層。
  • 在混色工具的選項面版內 【註4】 ,「形狀」項目設為圓錐形(對稱)。
  • 使用混色工具,從圖形的中心點,向右下角拉一條直線,產生圓錐狀的漸層。



以濾色 Screen 模式,重疊顯示
  • Conical 圖層與 Spiral 圖層以濾色混合模式,重疊顯示,讓 Spiral 圖層左上角有發光的感覺。
  • 調整 Conical 圖層的「透明度」,可改變左上角有發光的亮度。
  • 請注意,在圖層面版內Opacity 譯為「透明度」,但 Opacity 卻代表「不透明、不通透」的意思。





剪裁成圓形,改變角度,做出八層圖案
  • 合併 Conical 圖層與 Spiral 圖層,將影像剪裁成圓形,此時圖層名稱為 Spiral 。
 
  • 重複上述動作,改變製作圓錐狀的漸層所拉的直線的角度,產生不同的發光角度。
  • 也可複製多個相同的 Spiral 圖層(合併後的),使用旋轉工具來轉動圖案。
 
  • 此動畫總共有八個圖層。
  • 最下方的圖層要作為Background 圖層,是最先播放的圖層,將此圖層塗上橘色的底色。
 


儲存為 GIF
  • 執行[影像] / 圖片 / 模式 / 索引色 【註5】 ,將該影像轉為索引模式。
  • 執行[影像] / 檔案 / 另存新檔 【註6】 ,出現「儲存圖片」對話盒,將該圖存為 spiral_anim.gif 檔,出現「儲存為GIF」對話盒(Save as GIF)。
  • 在「儲存為GIF」對話盒內,「反覆循環」要勾選,畫格間的延遲時間可採用預設值100毫秒。
 

  • 存檔後,再重新載入spiral_anim.gif。
  • 會發現 GIF 畫格命名的規則,如下圖所示。



選單及項目名稱的英文:
【註1】Shape設Spiral (ccw)
【註2】[Image] / Colors / Threshold
【註3】[Image] / Filters / Blur / Gaussian Blur,Blur Radius設2
【註4】Shape設Conical(sym)
【註5】[Image] / Image / Mode / Indexed
【註6】[Image] / File / Save as


等價的 Python-Fu 程式碼
  • 接續前面的練習操作,改用 Python-Fu 自動化動畫的生成流程。

  • 下面的程式碼,分成四大部份:
    1. 首先,準備好新的影像,與所需的圖層。
    2. 產生螺紋的漸層,產生圓錐狀的漸層
    3. 改變角度,做出8畫格的動畫。若不包含背景,只需再做出7個畫格。
    4. 儲存為 GIF,再載入此檔案。

# Part 1.
# 圖片的尺寸
width = 256
height = 256
img = pdb.gimp_image_new(width, height, RGB)
bg_layer = pdb.gimp_layer_new(img, width, height, RGB_IMAGE, "Background", 100, NORMAL_MODE)
pdb.gimp_image_add_layer(img, bg_layer, 0)
# 底圖為橘色
orange = (252, 138, 5)
pdb.gimp_context_set_background(orange)
pdb.gimp_edit_fill(bg_layer, BACKGROUND_FILL)
# 將放置螺紋的圖案
spiral_layer = pdb.gimp_layer_copy(bg_layer, TRUE)
pdb.gimp_image_add_layer(img, spiral_layer, -1)
pdb.gimp_drawable_set_name(spiral_layer, "Spiral")
# 將放置圓錐狀的圖案
conical_layer = pdb.gimp_layer_copy(bg_layer, TRUE)
pdb.gimp_image_add_layer(img, conical_layer, -1)
pdb.gimp_drawable_set_name(conical_layer, "Conical")

pdb.gimp_display_new(img)


# Part 2.
center_x = width / 2
center_y = height / 2
start_x = center_x
start_y = center_y

# 前景色設為黑色,背景色設為白色
black = (0, 0, 0)
white = (255, 255, 255)
pdb.gimp_context_set_foreground(black)
pdb.gimp_context_set_background(white)

# 從圖形的中心點,向外拉一小條直線,線段的長度,決定螺紋的疏密
pdb.gimp_blend(spiral_layer, FG_BG_RGB_MODE, NORMAL_MODE, GRADIENT_SPIRAL_ANTICLOCKWISE, 100, 0, REPEAT_TRIANGULAR, FALSE, FALSE, 0, 0, 0, start_x, start_y, start_x + 8, start_y + 8)

pdb.gimp_threshold(spiral_layer, 127, 255)

# 從圖形的中心點,向右下角拉一條直線,產生圓錐狀的漸層
pdb.gimp_blend(conical_layer, FG_BG_RGB_MODE, NORMAL_MODE, GRADIENT_CONICAL_SYMMETRIC, 100, 0, REPEAT_NONE, FALSE, FALSE, 0, 0, 0, start_x, start_y, width - 1 , height - 1)
# 剪裁成圓形
pdb.gimp_ellipse_select(img, 0, 0, width - 1, height -1 ,  CHANNEL_OP_REPLACE, FALSE, FALSE, 0)
pdb.gimp_selection_shrink(img, 10)
pdb.gimp_selection_invert(img)
pdb.gimp_edit_clear(conical_layer)
pdb.gimp_edit_clear(spiral_layer)
pdb.gimp_selection_none(img)
opacity = 70
pdb.gimp_layer_set_opacity(conical_layer, opacity)
pdb.gimp_layer_set_mode(conical_layer, SCREEN_MODE)


# Part 3.
layer_num = 7
layer_list = []
for i in range(0,layer_num):
  spiral_tmp = pdb.gimp_layer_copy(spiral_layer, TRUE)
  pdb.gimp_image_add_layer(img, spiral_tmp, -1)
  drw_tmp = pdb.gimp_layer_copy(conical_layer, TRUE)
  layer_list.append(drw_tmp)
  pdb.gimp_image_add_layer(img, layer_list[i], -1)
  pdb.gimp_layer_set_mode(layer_list[i], SCREEN_MODE)
  angle = [0, -45, -90, -135, -180, -225, -270, -315]
  drw_tmp = pdb.gimp_drawable_transform_rotate_default(layer_list[i], angle[i], FALSE, center_x, center_y, INTERPOLATION_NONE, TRANSFORM_RESIZE_ADJUST)
  layer_list[i] = pdb.gimp_image_merge_down(img, drw_tmp, EXPAND_AS_NECESSARY)
  # 產生圖層 Conical1, ... , Conical7
  name = "Conical" + str(i+1) + "(100ms)"
  pdb.gimp_drawable_set_name(layer_list[i], name)

pdb.gimp_image_remove_layer(img, conical_layer)
bg_layer = pdb.gimp_image_merge_down(img, spiral_layer, EXPAND_AS_NECESSARY)
name = "Background"
pdb.gimp_drawable_set_name(bg_layer, name)


# Part 4.
pdb.gimp_convert_indexed(img, NO_DITHER, MAKE_PALETTE, 255, FALSE, FALSE, 0)
gif_file = "/tmp/spiral_anim.gif"
pdb.file_gif_save(img, bg_layer, gif_file, "", FALSE, TRUE, 100, 0)

img_gif = pdb.file_gif_load(gif_file, "")
pdb.gimp_display_new(img_gif)

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

  • 確定你也是在 Linux 環境下,有 /tmp 目錄。
  • 前往 /tmp 目錄,就會看到螺紋旋轉的動畫檔,其視效,如下圖所示。

  • 下圖是螺紋旋轉動畫 GIF 圖檔的圖層結構。