[Part I. GIMP基礎功]

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



25.7 紋理圖,修改成可「單行」執行的 Python-Fu

使用80 x 80 橘色方塊,來測試「纖維紋路」的效果
  • 原本的clothify.scm需要參考到既存的影像物件、圖層物件,才能正確運行。
  • 添加「建立 80 x 80 橘色圖層」的程式碼,這樣「纖維紋路的程式」才能正確運行 。
  • 下圖是程式碼執行後的圖案,80 x 80 橘色方塊。

swidth = 80
sheight = 80
#新增影像物件
square_img = pdb.gimp_image_new(swidth, sheight, RGB)
#新增圖層物件
square_drw = pdb.gimp_layer_new(square_img, swidth, sheight, RGB_IMAGE, "tmp", 100, NORMAL_MODE)
#將圖層物件加入影像物件
pdb.gimp_image_add_layer(square_img, square_drw, 0)

color = (234, 125, 30)
pdb.gimp_context_set_background(color)
pdb.gimp_edit_fill(square_drw, BACKGROUND_FILL) #填滿橘色

pdb.gimp_display_new(square_img)


修改後的程式碼,與測試的結果圖
  • 啟動 GIMP Python Console
  • 將下面的程式碼,全部選取、複製、再貼到 Python Console 提示符號 >>> 之後,按下 Enter 。
  • 過一會,就會看到結果圖,衣料的紋路。

# 要先準備好「測試用的影像與圖層」
timg = square_img #指派影像物件
tdrawable = square_drw #指派圖層物件
#t 表示 temporary 臨時的

bx = 9
by = 9
azimuth = 135
elevation = 45
depth = 3

width = pdb.gimp_drawable_width(tdrawable)
height = pdb.gimp_drawable_height(tdrawable)
img = pdb.gimp_image_new(width, height, RGB)
layer_one = pdb.gimp_layer_new(img, width, height, RGB_IMAGE, "X, Dots", 100, NORMAL_MODE)
layer_two = 0
bump_layer = 0

pdb.gimp_context_push()

pdb.gimp_image_undo_disable(img)

pdb.gimp_image_add_layer(img, layer_one, 0)

color = (255, 255, 255)
pdb.gimp_context_set_background(color)
pdb.gimp_edit_fill(layer_one, BACKGROUND_FILL)

pdb.plug_in_noisify(img, layer_one, FALSE, 0.7, 0.7, 0.7, 0.7)

layer_two = pdb.gimp_layer_copy(layer_one, 0)
pdb.gimp_layer_set_mode(layer_two, MULTIPLY_MODE)
pdb.gimp_image_add_layer(img, layer_two, 0)

pdb.gimp_display_new(img) # 顯示 img 物件

pdb.plug_in_gauss_rle(img, layer_one, bx, TRUE, FALSE)
pdb.plug_in_gauss_rle(img, layer_two, by, FALSE, TRUE)
#pdb.gimp_image_flatten(img)
bump_layer = pdb.gimp_image_get_active_layer(img)

pdb.plug_in_c_astretch(img, bump_layer)
pdb.plug_in_noisify(img, bump_layer, FALSE, 0.2, 0.2, 0.2, 0.2)

pdb.plug_in_bump_map(img, tdrawable, bump_layer, azimuth, elevation, depth, 0, 0, 0, 0, FALSE, FALSE, 0)
#pdb.gimp_image_delete(img)
pdb.gimp_displays_flush()

pdb.gimp_context_pop()


觀看纖維紋路的合成原理
  • 增加顯示 img 物件的程式碼 gimp_display_new(img)
  • 以分號註解下面這兩行
    • gimp_image_flatten(img)
    • gimp_image_delete(img)
  • 這樣就會看到兩個圖層疊合的效果,可參考25.3節25.4節的分析。

  • 實際產生縱橫交織的紋路時,不能註解gimp_image_flatten(img)
  • 因為,兩圖層要合併,才能讓受作用的圖案,垂直方向與水平方向,都產生紋路。