[Part I. GIMP基礎功]

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



顯示具有 第22章 印刷文字(Newsprint Text) 標籤的文章。 顯示所有文章
顯示具有 第22章 印刷文字(Newsprint Text) 標籤的文章。 顯示所有文章

22.1 修改「印刷文字」程式碼

名稱
  • Newsprint Text,在2.2版時,譯詞是「印刷文字」。
  • Logos,在2.2版時,譯詞是「標誌」。


參考別人的程式,是學習撰寫程式的好方法
  • 就連「印刷文字」標誌的程式碼,也是參考「異樣發光」標誌的程式碼。
  • 在撰寫自己所需的Script-Fu程式之前,可以先複製一個Script-Fu程式,先研究Script-Fu程式的運作。
  • 可將既有的Script-Fu程式,作為參考與修改的範本。
  • 複製news-text.scm檔,另外存成news-text2.scm檔,而後,使用文字編輯器,修改news-text2.scm檔。
  • news-text.scm程式碼,編上行號,檔頭也編號,保留空白行。
  • news-text.scm程式碼,請參考「22.5 程式news-text.scm分三部份」


news-text2.scm程式碼修改的部份:
  • 第22、76、93行,script-fu-newsprint-text改為script-fu-newsprint-text2
  • 第77行 "Newsprint Te_xt..." 改為 "Newsprint Te_xt2..."
  • 第83行"Newsprint" 改為 "Gimp"


選一個好的文字編輯器
  • 可以用 PSPad 來修改程式。
  • PSPad 可以顯示行號。


第一種方式:只修改註冊於PDB內的函數名稱

22.2 執行「印刷文字」程式碼

Step 1.
  • 若還未執行GIMP程式,請啟動GIMP程式。
  • 本節示範「第一種方式:只修改註冊於PDB內的函數名稱」。


Step 2.
  • 若已啟動GIMP程式,執行[影像] / 濾鏡 / Script-Fu / Refresh Scripts【註1】,更新GIMP的程序資料庫內的資料。



Step 3.
  • 這時候,Logos選單內,多了 Newsprint Text2 這個選項,如下圖所示。



Step 4.
  • 執行[影像] / 檔案 / 建立 / Logos / Newsprint Text2【註2】,會產生一張「印刷文字」的標誌,這是利用「報紙印刷」濾鏡所製作出的字體效果,字體帶有圓形斑點,如下圖所示。



選單及項目名稱的英文:
【註1】[Image] / Filters / Script-Fu / Refresh Scripts
【註2】[Image] / File / Create / Logos / Newsprint Text2

22.3 查詢「印刷文字」資料集


22.4 解析「印刷文字」對話盒

Logos 選單的新項目
  • 下圖是 Logos 選單的一部份,「Newsprint Text2」已出現在選單內。
  • 代表 news-text2.scm 這個 Script-Fu 在 GIMP 視窗介面裡所在的位置。


也就是, news-text2.scm 的執行位置,由「Logos」選單與「Newsprint Text2」項目名稱來決定。
77: _"Newsprint Te_xt2..."
94: "<Image>/File/Create/Logos")
程式碼第77行與第94行合起來,相當於:
  • "<Image>/File/Create/Newsprint Text2"
  • 代表了在GIMP視窗介面裡news-text2.scm這個Script-Fu所在的位置。


Newsprint Text2 對話盒內的控制元件



  • 對話盒內,有八樣控制元件,其顯示的資訊、參數的設定,與程式碼的對應關係為:
程式碼 對話盒的參數設定
第83行 Text: Gimp (預設的字串Newsprint,更改為Gimp)
第84行 Font: Sans
第85行 Font size(pixels): 100
第86行 Cell size(pixels): 100
第87行 Density (%): 60
第88行 Blur radius: 0 (可調整參數值的捲動按鈕)
第89行 Text color: black
第90行 Background color: white


SF-STRING 文字輸入框
第83行: SF-STRING _"Text" "Gimp",原為"Newsprint",將它改為"Gimp"
  • SF-STRING,表示會在Newsprint Text2對話盒上,產生一個字串的文字輸入框。
  • "Text String",為輔助說明的文字。
  • "Gimp",表示文字輸入框內預設的字串為Gimp。


SF-FONT 設定字型的對話盒
第84行: SF-FONT _"Font" "Sans"
  • SF-FONT,在對話盒上產生一個字型設定的按鈕,按下按鈕,可啟動設定字型的對話盒。
  • "Font",為輔助說明的文字。
  • "Sans",為預設字型。


SF-ADJUSTMENT 調整大小值的控制元件
第85行: SF-ADJUSTMENT _"Font size (pixels)" '(100 2 1000 1 10 0 1)
  • SF-ADJUSTMENT,在對話盒上產生一個可上下調整大小值的控制元件。
  • "Font size (pixels)",為輔助說明的文字。
  • '(100 2 1000 1 10 0 1),字形大小的預設值為100、最小值為2、最大值為1000,每次調整控制元件時,字形大小的增加為1。


接收參數,執行程式碼
第22行: (define (script-fu-newsprint-text2 string font font-size cell-size
第23行: density blur-radius text-color bg-color)
  • 藉由Newsprint Text2對話盒所輸入的參數,設定script-fu-newsprint-text2函式的string、font、font-size......八個變數。
  • 按下對話盒的「確定」按鈕後,按鈕上方的顯示框內,文字訊息會快速改變,此時script-fu-newsprint-text2函數被呼叫,傳入變數設定,news-text2.scm從第22行執行到第74行。
第70行:(gimp-display-new img)
  • 秀出最終成品的字體圖,一張「報紙印刷」字體的Gimp標誌圖。

22.5 程式news-text.scm分三部份

  • 若用PSPad開啟程式檔(或任何文字編輯器),看到的Script-Fu程式碼,變數會對得很整齊。
  • 下圖顯示,括號的對齊,括號內的東西,是屬於 let* 函數的參數。


  • HTML會把大量的空白省略,因此程式碼的排版變成了下面這樣子。
  • 我替Script-Fu程式碼加上行號乎,方便讀者閱讀。

程式news-text.scm分三部份:
  • 1~21行:註解,功能說明與版權聲明。
  • 22~75行:定義函式,在測試程式的過程中,可將它改為 (define (script-fu-newsprint-text2 … ))
  • 76~95行:註冊函式,可將它改為(script-fu-register "script-fu-newsprint-text2" … )

第1到第21行:註解說明
1: ; Newsprint text
2: ; Copyright (c) 1998 Austin Donnelly <austin@greenend.org.uk>
3: ;
4: ;
5: ;Based on alien glow code from Adrian Likins
6: ;
7: ; This program is free software; you can redistribute it and/or modify
8: ; it under the terms of the GNU General Public License as published by
9: ; the Free Software Foundation; either version 2 of the License, or
10: ; (at your option) any later version.
11: ;
12: ; This program is distributed in the hope that it will be useful,
13: ; but WITHOUT ANY WARRANTY; without even the implied warranty of
14: ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: ; GNU General Public License for more details.
16: ;
17: ; You should have received a copy of the GNU General Public License
18: ; along with this program; if not, write to the Free Software
19: ; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20:
21:

第22到第75行:定義函式
22: (define (script-fu-newsprint-text string font font-size cell-size
23: density blur-radius text-color bg-color)
24: (let* (
25: (text-ext (gimp-text-get-extents-fontname string font-size PIXELS font))
26: (width (+ (car text-ext) 20 blur-radius))
27: (height (+ (list-ref text-ext 1) 20 blur-radius))
28: (img (car (gimp-image-new width height RGB)))
29: (bg-layer (car (gimp-layer-new img width height RGB-IMAGE "Background" 100 NORMAL-MODE)))
30: (text-layer (car (gimp-layer-new img width height RGBA-IMAGE "Text layer"
100 NORMAL-MODE)))
31: (text-mask 0)
32: (grey (/ (* density 255) 100))
33: )
34:
35: (gimp-context-push)
36:
37: (gimp-image-undo-disable img)
38: (gimp-image-add-layer img bg-layer 1)
39: (gimp-image-add-layer img text-layer -1)
40:
41: (gimp-context-set-background bg-color)
42: (gimp-edit-clear bg-layer)
43: (gimp-edit-clear text-layer)
44:
45: (gimp-context-set-foreground text-color)
46: (gimp-floating-sel-anchor
47: (car (gimp-text-fontname img text-layer
48: (/ (+ 20 blur-radius) 2) (/ (+ 20 blur-radius) 2)
49: string 0 TRUE font-size PIXELS font)))
50:
51: (set! text-mask (car (gimp-layer-create-mask text-layer ADD-ALPHA-MASK)))
52: (gimp-layer-add-mask text-layer text-mask)
53:
54: (gimp-selection-layer-alpha text-layer)
55: (gimp-context-set-background (list grey grey grey))
56: (gimp-edit-fill text-mask BACKGROUND-FILL)
57: (gimp-selection-none img)
58: (if (> blur-radius 0)
59: (plug-in-gauss-iir RUN-NONINTERACTIVE img text-mask blur-radius 1 1)
60: )
61:
62: (plug-in-newsprint RUN-NONINTERACTIVE img text-mask cell-size
63: 0 0 45.0 3 45.0 0 45.0 0 45.0 0 3)
64:
65: (gimp-edit-fill text-layer FOREGROUND-FILL)
66: (gimp-layer-remove-mask text-layer MASK-APPLY)
67:
68: (gimp-image-undo-enable img)
69:
70: (gimp-display-new img)
71:
72: (gimp-context-pop)
73: )
74: )
75:

第76到第95行:註冊函式
76: (script-fu-register "script-fu-newsprint-text"
77: _"Newsprint Te_xt..."
78: _"Create a logo in the style of newspaper printing"
79: "Austin Donnelly"
80: "Austin Donnelly"
81: "1998"
82: ""
83: SF-STRING _"Text" "Newsprint"
84: SF-FONT _"Font" "Sans"
85: SF-ADJUSTMENT _"Font size (pixels)" '(100 2 1000 1 10 0 1)
86: SF-ADJUSTMENT _"Cell size (pixels)" '(7 1 100 1 10 0 1)
87: SF-ADJUSTMENT _"Density (%)" '(60 0 100 1 10 0 0)
88: SF-ADJUSTMENT _"Blur radius" '(0 0 100 1 5 0 0)
89: SF-COLOR _"Text color" "black"
90: SF-COLOR _"Background color" "white"
91: )
92:
93: (script-fu-menu-register "script-fu-newsprint-text"
94: "<Image>/File/Create/Logos")
95:



Script-Fu 必也行號乎
  • Script-Fu 程式碼過長時,要一行一行地解說,就需要加上行號。
  • 加行號是為了便於解說,實際執行的 Script-Fu 程式碼是沒有行號的。
  • 任何一款純文字的編輯器,都可以編輯 Script-Fu 程式碼。

以下這一大段圖文解說,與 Script-Fu 無任何關係,可以選擇略過不讀。

  • 我是使用 PSPad 加上 PDF Creator來產生行號。
  • 因此,讀者你也可以使用 PSPad 來編輯 Script-Fu 程式碼。 PSPad 可以標示行號,如此,閱讀以下的程式說明,會比較容易對照。

  • 以下,示範利用 PSPad ,加上 PDF Creator,來產生行號。
  • Step 1. 下圖,以 PSPad 開啟 news-text.scm 。 PSPad 的「檢視」功能表內,有「行號」這一個項目。在 PSPad 內,「顯示的行號」看得到,卻無法複製,但是行號可列印在紙上。因此,可利用虛擬的 PDF 印表機,讓所有的程式碼加上行號。


  • Step 2. 虛擬的印表機有很多,我使用 PDF Creator。請先下載並安裝 PDF Creator。而後,在 PSPad 內,就可列印文字檔news-text.scm,列印時,印表機選擇 PDF Creator,如下圖所示。


  • Step 3. 接著, PDF Creator會出現一個儲存檔案的對話盒,如下圖所示,使用預設的檔名news-text.pdf,按下Save按鈕,如此,純文字檔就轉換A4尺寸的 PDF 檔。


  • Step 4. 如下圖所示,以 Adobe Reader 開啟 news-text.pdf 。 Adobe Reader 可將 PDF 檔再轉為純文字檔,如此,就可得加上行號的程式碼。

22.6 單步執行「印刷文字」之「第一種方式」

單步追蹤1. 更新Scripts,更新資料庫
  • 整合式的軟體開發工具多有提供單步執行,讓程式能一次一行地執行,便於追蹤錯誤。可惜沒有人為Script-Fu發展更好的除錯工具。
  • 以下我用很原始的方法,呈現news-text2.scm這個Script-Fu完整的執行過程,透過這個方法,讀者應該會更瞭解這支程式。
  • 下圖展示了「Refresh Scripts」所在的位置,執行後,會更新GIMP的程序資料庫內的資料。



  • 若還未執行GIMP程式,請啟動GIMP程式,這樣也能更新程序資料庫。
  • 單步測試程式時,需要一直更新程序資料庫,因此讓Script-Fu選單是一個獨立的選單視窗,這樣可以加快測試的速度。
  • 下圖展示了獨立的「Script-Fu」選單,此時選單是一個視窗,「Refresh Scripts」就位在「Script-Fu」選單內。



單步追蹤2. 修改Scripts,增減程式碼
  • 完整的原始程式碼加上行號,表請參考前一節「news-text.scm 分三部份」。
  • 使用文字編輯器修改news-text2.scm檔
  • 刪除news-text2.scm程式碼第36行到第69行,儲存檔案。
  • Newsprint Text2對話盒中,預設的字串Newsprint,更改為Gimp。讓影像視窗小一些,方便展示說明。
  • 保留第35行、第70行、第72行,這是為了執行Script-Fu之後,能有影像視窗與作圖區。
  • 執行「Refresh Scripts」【註a】,更新GIMP的程序資料庫內的資料。
  • 執行「Newsprint Text2」【註b】,會出現下圖的影像視窗。
  • 下圖,影像視窗標題顯示「0 layers」,表示目前沒有。但並非此時真的不存在「圖層」,只是「圖層」還未與「影像」結合。


本小段之中,選單及項目名稱的英文:
【註a】[Image] / Filters / Script-Fu / Refresh Scripts
【註b】[Image] / File / Create / Logos / Newsprint Text2。Logos 在GIMP 2.2版譯成「標誌」。


單步追蹤3. 第24到第33行:變數與新影像
28: (img (car (gimp-image-new width height RGB)))
  • 產生新影像,影像尺寸根據文字圖層尺寸,將新影像存在img變數內。29: (bg-layer (car (gimp-layer-new img width height RGB-IMAGE "Background" 100 NORMAL-MODE)))
  • 產生新圖層,作為背景,圖層存在bg-layer變數內。在圖層面版內,圖層名稱為Background。

30: (text-layer (car (gimp-layer-new img width height RGBA-IMAGE "Text layer"
100 NORMAL-MODE)))
  • 產生新圖層,作為文字圖層,將文字圖層存在text-layer變數內。在圖層面版內,圖層名稱為Text layer。

注意:
(let* ( )
( )
……
)

  • 從第24行到第73行,整個程式被包在(let* )函式的括號內。
  • 第24行到第33行被包在括號內。
  • 在第24行到第33行定義的區域變數,使用範圍只到第33行之前。


單步追蹤4. 第38到第43行:加上兩個圖層
  • 在下圖的影像視窗標題上,顯示「2 layers」,表示影像已加上兩個圖層。而在圖層面版內,會發現有兩個圖層。

  • 在下圖的圖層面版內,圖層的名稱為「Text layer」與「Background」。


38: (gimp-image-add-layer img bg-layer 1)
39: (gimp-image-add-layer img text-layer -1)
40:
41: (gimp-context-set-background bg-color)
42: (gimp-edit-clear bg-layer)
43: (gimp-edit-clear text-layer)
  • 第42行,清除圖層內容後,「Background」圖層填上設定的背景色(白色)。
  • 第43行,清除圖層內容後,「Text layer」圖層顯現出透明。


單步追蹤5. 第45到第49行:圖層寫上文字
  • 使用文字編輯器,修改news-text2.scm檔。
  • 原本,已經刪除news-text2.scm程式碼的第36行到第69行。
  • 現在,加上45到49行,儲存檔案。
  • 執行「Refresh Scripts」【註a】,更新GIMP的程序資料庫內的資料。
  • 執行「Newsprint Text2」【註b】。

45: (gimp-context-set-foreground text-color)
46: (gimp-floating-sel-anchor
47: (car (gimp-text-fontname img text-layer
48: (/ (+ 20 blur-radius) 2) (/ (+ 20 blur-radius) 2)
49: string 0 TRUE font-size PIXELS font)))
  • 寫上前景色(黑色)的Gimp字樣。
  • 反轉顏色為白色字的Gimp。
  • 下圖展示了,在圖層面版內,圖層已加上了遮罩。


本小段之中,選單及項目名稱的英文:
【註a】[Image] / Filters / Script-Fu / Refresh Scripts
【註b】[Image] / File / Create / Logos / Newsprint Text2。Logos 在GIMP 2.2版譯成「標誌」。


休息一下,整理一下
  • 前面,第 1 步 ~ 第 5 步 ,單步執行「印刷文字」,至寫上字體。
  • 之後,第 6 步 ~ 第 8 步 ,單步執行「印刷文字」,至產生字效。


單步追蹤6. 第51與52行:新增圖層遮罩
  • 使用文字編輯器,修改news-text2.scm檔,加上51、52行,儲存檔案。
  • 執行「Refresh Scripts」,執行「Newsprint Text2」。
51: (set! text-mask (car (gimp-layer-create-mask text-layer ADD-ALPHA-MASK)))
52: (gimp-layer-add-mask text-layer text-mask)
  • 第51行,set!是用來宣告廣域變數的函式,以「Text layer」圖層的透明色版為樣本,產生圖層遮罩,存在text-mask變數內。
  • 第52行,替「Text layer」圖層加上遮罩。

  • 下圖為「新增圖層遮罩」對話盒,第51行的ADD-ALPHA-MASK,相當於初始化為「圖層的透明色版」選項。



單步追蹤7. 第54到第56行:完成填色三步
  • 加上54行至60行,儲存檔案。
  • 執行「Refresh Scripts」,執行「Newsprint Text2」。

  • 下圖的影像視窗內,黑白相混呈現灰色。因為遮罩填上灰色,上方的黑色呈現半透明,與下方的白色相混。

54: (gimp-selection-layer-alpha text-layer)
55: (gimp-context-set-background (list grey grey grey))
56: (gimp-edit-fill text-mask BACKGROUND-FILL)
  • 54、55、56行是對遮罩填上灰色的動作。

  • Script-Fu程式碼的寫作,有一個固定的組合。
  • 填色要三個步驟、三行程式碼:
    • 設定作用中圖層,或選取一個填色範圍。
    • 設定顏色,設定前景色或背景色。
    • 填滿顏色。
  • 別忘了,把大象放到冰箱,也要三個步驟。Just a joke!


單步追蹤8. 第57到第66行:產生圓形斑點
  • 執行「報紙印刷濾鏡」產生斑點,不能在全黑的文字上。因此,遮罩的文字是灰色。可用模糊濾鏡,改變文字邊緣的灰度。
  • 下圖為最終成果圖,已執行完「報紙印刷」濾鏡。

  • 加上57行至66行,儲存檔案。
  • 執行「Refresh Scripts」,執行「Newsprint Text2」。
  • 57行,釋放選取區域。
  • 59行,模糊遮罩上的文字。
57: (gimp-selection-none img)
58: (if (> blur-radius 0)
59: (plug-in-gauss-iir RUN-NONINTERACTIVE img text-mask blur-radius 1 1)
60: )
62: (plug-in-newsprint RUN-NONINTERACTIVE img text-mask cell-size
63: 0 0 45.0 3 45.0 0 45.0 0 45.0 0 3)
64:
65: (gimp-edit-fill text-layer FOREGROUND-FILL)
66: (gimp-layer-remove-mask text-layer MASK-APPLY)

22.7 「圓形斑點」效果之分析

分析1:圓形斑點生成的原由
  • 下述內容,以簡單的方形黑色塊,示範「報紙印刷」濾鏡的功效與其原由。
  • 下圖是一張長寬128x128的影像,中間填上純黑色,四周畫上純紅色的邊界線。
  • 執行「報紙印刷」濾鏡,完全黑色的區域無法產生斑點。

  • 對前圖黑白分明的影像,執行「高斯模糊」濾鏡,模糊半徑設為10。
  • 下圖是一張邊緣略微模糊的影像。

  • 對前圖,執行「報紙印刷」濾鏡,紅綠藍三個分頁的參數設相同。
  • 如此的設定,產生下圖黑、白、紅的斑點。



分析2:查詢 plug-in-newsprint 函數
  • 本章之中,許多函數的功能,沒有解釋清楚。許多參數的設定,也沒有解釋。
  • 可透過 Procedure Browser 查詢這些資料。
  • 下述內容,以查詢 plug-in-newsprint 函數為例子。
  • 若要更瞭解 news-text.scm,只有靠自己仔細研讀與分析了!加油!

  • 執行[影像] / 求助 / Procedure Browser,查詢 plug-in-newsprint 這函數。
  • 下圖是 Procedure Browser 對話盒的一部分。



分析3:參數的意義與 drawable 所代表的物件
62與63行: (plug-in-newsprint RUN-NONINTERACTIVE img text-mask cell-size 0 0 45.0 3 45.0 0 45.0 0 45.0 0 3)
  • 根據 Procedure Browser 對話盒,所查到的資料,plug-in-newsprint 參數的意思為:
    • 第1個參數 RUN-NONINTERACTIVE,表示非互動式。
    • 第2個參數 img,表示欲執行報紙印刷濾鏡功能的影像的名字。
    • 第3個參數 text-mask,表示欲執行報紙印刷濾鏡功能的遮罩的名字(drawable)。
    • 第4個參數 cell-size,影響斑點的大小。
    • 第5個參數 0,表示 RGB 色彩模式。
    • 第6個參數與 CMYK 色彩模式的 K 分量有關。
    • 之後的參數,兩兩成對,設定各類色版所欲採用的斑點角度與斑點外形。
  • drawable 通常是指圖層。一個影像可由多個圖層組成,現在已被選取到的,可在其上做運算的圖層稱為 drawable 。
  • 除了圖層,drawable 也可廣義地包含色版、遮罩、浮動選取區域。


分析4:報紙印刷濾鏡作用於灰階的遮罩
  • 下圖展示了執行到第57行時所產生的遮罩。

  • 對遮罩,執行[影像] / 濾鏡 / 扭曲 / 報紙印刷濾鏡,出現對話盒。
  • 下圖是「報紙印刷」濾鏡的對話盒,Cell size 設7,角度設45。
  • 遮罩相當於一張只有灰階色版的影像。
  • 因此,下圖之中,「畫面」選項只有一分頁,為「灰」色版。

62與63行: (plug-in-newsprint RUN-NONINTERACTIVE img text-mask cell-size 0 0 45.0 3 45.0 0 45.0 0 45.0 0 3)
  • 在「報紙印刷」濾鏡對話盒之中,按下「確定」按鈕,得到下圖的斑點效果。
  • 在圖層遮罩上,呈現出「報紙印刷」效果的文字。

22.8 單步執行的「第二種方式」與「第三種方式」

單行可執行的程式碼,很適合用於學習 Script-Fu 與 Python-Fu
三種單步執行程式的方式
  • 第一種方式:只修改註冊於PDB內的函數名稱
  • 第二種方式:修改成在 Console 內可一行一行執行的 Scheme 程式碼
  • 第三種方式:修改成在 Console 內可一行一行執行的 Python 程式碼


本節介紹「第二種方式」,以 news-text.scm 為例
  • 本節介紹單步執行的「第二種方式」,可「單行」執行的 Scheme code 。
  • news-text.scm 完整的程式碼可參考 22.5 節。
  • 也可到 GIMP 系統的 scripts 目錄下找到該檔案。
  • 最主要修改的部份是,將「對話框接收輸入變數值」修改成「直接指定輸入變數值」。
  • 先要瞭解,news-text.scm 程式碼的執行流程。


不使用 let* 改用 define
  • 原本的程式使用 let* 定義與指定區域變數值。
  • (let* (()()()...) ()() ...) 這樣的語法括號太多。
  • 若要一行一行分析程式碼的意義,let* 語法,括號有好幾層,分析時,會造成一些干擾。
  • 現在不使用 let* 改用 define 來定義與指定變數值。


如何用人工的方式判斷,左右括號對齊
  • 心中有個計數器,一開始為 0 。
  • 從左至右掃描程式碼,在心中默數。
  • 看到左括號 ( 加 1 。
  • 看到右括號 ) 減 1 。
  • 掃描完,若復歸為 0 ,則表示左右括號在數量上是對齊的。
  • 掃描的過程中,計數器值若為負值 ,則表示此時右括號多於左括號 ,這是也是不合理的。

  • news-text.scm 以這一行 Scheme code 為例

(define grey (/ (* density 255) 100))
1            2  3             2   1 0

  • news-text.scm 之中,下面這一行應該是最複雜的。
  • 讀者可自行練習,判斷括號對齊與否。

(gimp-floating-sel-anchor
(car (gimp-text-fontname img text-layer
(/ (+ 20 blur-radius) 2) (/ (+ 20 blur-radius) 2)
string 0 TRUE font-size PIXELS font)))


捨棄函數 script-fu-newsprint-text,直接指定輸入變數值
  • 修改成最多的地方就是下列的這部份。
  • 修改後的程式碼,不再需要預先定義函數 script-fu-newsprint-text ,但是要預先設定變數名稱、變數值 。
(define (script-fu-newsprint-text string font font-size cell-size density blur-radius text-color bg-color)
(let* (
(text-ext ......)
(width ......)
(height ......)
(img ......)
(bg-layer .....)
(text-layer ......)
(text-mask ......)
(grey .....)
)

  • 從下列的程式碼得知變數值的型態與大小 。

SF-STRING _"Text" "Newsprint"
SF-FONT _"Font" "Sans"
SF-ADJUSTMENT _"Font size (pixels)" '(100 2 1000 1 10 0 1)
SF-ADJUSTMENT _"Cell size (pixels)" '(7 1 100 1 10 0 1)
SF-ADJUSTMENT _"Density (%)" '(60 0 100 1 10 0 0)
SF-ADJUSTMENT _"Blur radius" '(0 0 100 1 5 0 0)
SF-COLOR _"Text color" "black"
SF-COLOR _"Background color" "white"

22.9 印刷字,修改成可「單行」執行的 Script-Fu

最主要修改的部份
  • 本節介紹單步執行程式的「第二種方式」。
  • news-text.scm 完整的程式碼可參考 22.5 節。
  • 也可到 GIMP 系統的 scripts 目錄下找到該檔案。
  • 最主要修改的部份是,將「對話框接收輸入變數值」修改成「直接指定輸入變數值」。
  • 也就是,刪掉 ,不使用 let* 改用 define


修改後的程式碼,與測試的結果圖
  • 下面是修改後的程式碼。
  • 啟動 GIMP Script-fu Console
  • 將下面的 Scheme 程式碼,全部選取、複製、再貼入 Script-fu Console 文字框,按下 Enter 。
  • 過一會,就會看到結果圖。


(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")

(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)
(define grey (/ (* density 255) 100))

(gimp-context-push)

(gimp-image-undo-disable img)
(gimp-image-add-layer img bg-layer 1)
(gimp-image-add-layer img text-layer -1)

(gimp-context-set-background bg-color)
(gimp-edit-clear bg-layer)
(gimp-edit-clear text-layer)

(gimp-context-set-foreground text-color)
(gimp-floating-sel-anchor (car (gimp-text-fontname img text-layer (/ (+ 20 blur-radius) 2) (/ (+ 20 blur-radius) 2) string 0 TRUE font-size PIXELS font)))

(set! text-mask (car (gimp-layer-create-mask text-layer ADD-ALPHA-MASK)))
(gimp-layer-add-mask text-layer text-mask)

(gimp-selection-layer-alpha text-layer)
(gimp-context-set-background (list grey grey grey))
(gimp-edit-fill text-mask BACKGROUND-FILL)
(gimp-selection-none img)
(if (> blur-radius 0)
(plug-in-gauss-iir RUN-NONINTERACTIVE img text-mask blur-radius 1 1)
)

(plug-in-newsprint RUN-NONINTERACTIVE img text-mask cell-size 0 0 45.0 3 45.0 0 45.0 0 45.0 0 3)

(gimp-edit-fill text-layer FOREGROUND-FILL)
(gimp-layer-remove-mask text-layer MASK-APPLY)

(gimp-image-undo-enable img)

(gimp-display-new img)

(gimp-context-pop)

22.10 印刷字,修改成可「單行」執行的 Python-Fu

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


blur_radius = 0
size = (blur_radius + 20) / 2
density = 60
cell_size = 7
string = "Newsprint"
font_size = 100
font = "Arial"

text_ext = pdb.gimp_text_get_extents_fontname(string, font_size, PIXELS, font)
width = text_ext[0] + 20 + blur_radius
height= text_ext[1] + 20 + blur_radius

text_color = (0, 0, 0)
bg_color = (255, 255, 255)
img = pdb.gimp_image_new(width, height, RGB)
pdb.gimp_display_new(img)

bg_layer = gimp.Layer(img, "Background", width, height, RGB_IMAGE, 100, NORMAL_MODE)
text_layer = gimp.Layer(img, "Text layer", width, height, RGBA_IMAGE, 100, NORMAL_MODE)

#pdb.gimp_image_undo_disable(img)

img.add_layer(bg_layer, 1)
img.add_layer(text_layer, -1)

text_mask = 0
grey = (density * 255) / 100


gimp.set_background(bg_color)

pdb.gimp_edit_clear(bg_layer)
pdb.gimp_edit_clear(text_layer)

gimp.set_foreground(text_color)

tmp_layer = pdb.gimp_text_fontname(img, text_layer, size, size ,string, 0, TRUE, font_size, PIXELS, font)
pdb.gimp_floating_sel_anchor(tmp_layer)

text_mask = pdb.gimp_layer_create_mask(text_layer, ADD_ALPHA_MASK)

pdb.gimp_layer_add_mask(text_layer, text_mask)


pdb.gimp_selection_layer_alpha(text_layer)
#pdb.gimp_context_set_background(grey, grey, grey)
gimp.set_background(grey, grey, grey)
pdb.gimp_edit_fill(text_mask, BACKGROUND_FILL)
pdb.gimp_selection_none(img)
blur_radius = 5
if blur_radius > 0:
    pdb.plug_in_gauss_iir(img, text_mask, blur_radius, 1, 1) # 不需要 RUN_NONINTERACTIVE 這個參數

pdb.plug_in_newsprint(img, text_mask, cell_size, 0, 0, 45.0, 3, 45.0, 0, 45.0, 0, 45.0, 0, 3) # 不需要 RUN_NONINTERACTIVE 這個參數
pdb.gimp_edit_fill(text_layer, FOREGROUND_FILL)
pdb.gimp_layer_remove_mask(text_layer, MASK_APPLY)

#pdb.gimp_image_undo_enable(img)

#pdb.gimp_display_new(img)

#pdb.gimp_context_pop()

22.11 印刷字,修改過程中,須注意的 Python 語法特點

計算出文字所需的長寬
Scheme code
(define text-ext (gimp-text-get-extents-fontname string ...))
(define width (+ (car text-ext) 20 blur-radius))
(define height (+ (list-ref text-ext 1) 20 blur-radius))

Python code
text_ext = pdb.gimp_text_get_extents_fontname(string, ......)
width = text_ext[0] + 20 + blur_radius
height= text_ext[1] + 20 + blur_radius


加減乘除四則運算
Scheme code
(define grey (/ (* density 255) 100))
Python code
grey = (density * 255) / 100

if 條件控制的敘述
Scheme code

(if (> blur-radius 0)
(plug-in-gauss-iir RUN-NONINTERACTIVE img ......)
)

Python code 要注意縮排

if blur_radius > 0:
  pdb.plug_in_gauss_iir(img, ......)


RGB 顏色的指定
Scheme code
(define text-color "black")
(define bg-color "white")

Python code
text_color = (0, 0, 0)
bg_color = (255, 255, 255)