[Part I. GIMP基礎功]

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

21.7 以印刷字 news-text.scm 為例,摸索 Scheme 轉為 Python 的技巧

轉換的過程,需要一些時間摸索
  • 本節的重點,在於轉碼的技巧。
    • 本節介紹單步執行的「第三種方式」,修改成在 Console 內可一行一行執行的 Python 程式碼 。
    • 接續前節,使用前節更改後的 Scheme 程式碼,將它改成 Python 程式碼 。

  • 摸索的過程:
    • 要先熟悉 Scheme 與 Python 的基本語法。
    • 一開始,先用手工更改,慢慢瞭解兩者語法的差異。
    • 而後,利用文字編輯器「搜尋」與「取代」的功能,修改程式碼。
    • 經過一番摸索,整理需要修改之處,利用 Python 「正規表示式」的功能,將 Scheme code 轉為 Python code。
    • 經過一番摸索,最終,將「轉碼的流程」寫成 Python 程式 scm_to_py_.py
    • 多數的修改,都可由 scm_to_py_.py 自動完成。


摸索「變數值指派的程式碼」的修改技巧
  • 有些地方,可以直接手動更改。
  • 有些地方,手動更改,太累人了。
  • 文字編輯器都有「搜尋」與「取代」的功能。
  • 善用「搜尋」與「取代」,可幫助修改程式碼。

(define string "Newsprint")
(define font "Sans")
(define font-size 100)
(define cell-size 7)

(define density 60)
(define blur-radius 5) ; 原本為 0 我改用 5
(define text-color "black")
(define bg-color "white")

  • 可分段使用「搜尋」與「取代」的功能。
  • 先專注分析一小段程式碼 Scheme code 與 Python code 的差異。
  • 例如,上一段程式碼,是用於「變數值指派」。
    • (define ...) 開頭的 (define 是要刪除的
    • (define ...) 結尾的 ) 是要刪除的
    • 將「空白」取代為 等號 =
  • 「取代」之後的程式碼,如下所示。

string = "Newsprint"
font = "Sans"
font_size = 100
cell_size = 7

density = 60
blur_radius = 5 # 原本為 0 我改用 5

text_color = "black"
bg_color = "white"

  • 但是 Python 無法解讀 "black" 與 "white" 的意義,要再改為 (0, 0, 0) 與 (255, 255, 255)。


摸索「指派影像物件、圖層物件的程式碼」的修改技巧

(define text-ext (gimp-text-get-extents-fontname string font-size PIXELS font))
(define width (+ (car text-ext) 20 blur-radius))
(define height (+ (list-ref text-ext 1) 20 blur-radius))
(define img (car (gimp-image-new width height RGB)))
(define bg-layer (car (gimp-layer-new img width height RGB-IMAGE "Background" 100 NORMAL-MODE)))
(define text-layer (car (gimp-layer-new img width height RGBA-IMAGE "Text layer" 100 NORMAL-MODE)))

  • 上一段程式碼是用於「指派影像物件、圖層物件」。
    • (define ...) 開頭的 (define 是要刪除的
    • (define ...) 結尾的 ) 是要刪除的
    • 利用換行符號的逃脫字符 \n 可輕鬆刪除結尾的 )
    • 也就是,在文字編輯器「取代」功能的對話框內,將 )\n 取代為 \n
    • 將 (car 取代為 等號 =
    • 將(...... layer-two 0)「空白」取代為 等號 =
    • 將剩餘的「空白」取代為 "逗點加空白"「, 」
    • 將 (gimp 取代為 pdb.gimp
    • 將 減號 - 取代為 _ 底線
  • 其它不符合 Python 語法之處,直接手動更改。
  • 「取代」之後的程式碼,如下所示。

(define text-ext (gimp-text-get-extents-fontname string font-size PIXELS font))
(define width (+ (car text-ext) 20 blur-radius))
(define height (+ (list-ref text-ext 1) 20 blur-radius))
(define img (car (gimp-image-new width height RGB)))
(define bg-layer (car (gimp-layer-new img width height RGB-IMAGE "Background" 100 NORMAL-MODE)))
(define text-layer (car (gimp-layer-new img width height RGBA-IMAGE "Text layer" 100 NORMAL-MODE)))
(define text-mask 0)