編寫 GIMP 腳本使圖像處理更快
前一段時間,我想給方程圖片加一個黑板式的外觀。我開始是使用 GIMP 來處理的,我對結果很滿意。問題是我必須對圖像執行幾個操作,當我想再次使用此樣式,不想對所有圖像重複這些步驟。此外,我確信我會很快忘記這些步驟。
![Fourier transform equations](/data/attachment/album/202102/06/231049kyoir5ewk57r7ooc.png "Fourier transform equations")
傅立葉變換方程式(Cristiano Fontana,[CC BY-SA 4.0] 4)
GIMP 是一個很棒的開源圖像編輯器。儘管我已經使用了多年,但從未研究過其批處理功能或 Script-Fu 菜單。這是探索它們的絕好機會。
什麼是 Script-Fu?
Script-Fu 是 GIMP 內置的腳本語言。是一種基於 Scheme 的編程語言。如果你從未使用過 Scheme,請嘗試一下,因為它可能非常有用。我認為 Script-Fu 是一個很好的入門方法,因為它對圖像處理具有立竿見影的效果,所以你可以很快感覺到自己的工作效率的提高。你也可以使用 Python 編寫腳本,但是 Script-Fu 是默認選項。
為了幫助你熟悉 Scheme,GIMP 的文檔提供了深入的 教程。Scheme 是一種類似於 Lisp 的語言,因此它的主要特徵是使用 前綴 表示法和 許多括弧。函數和運算符通過前綴應用到操作數列表中:
(函數名 操作數 操作數 ...)
(+ 2 3)
↳ 返回 5
(list 1 2 3 5)
↳ 返回一個列表,包含 1、 2、 3 和 5
我花了一些時間才找到完整的 GIMP 函數列表文檔,但實際上很簡單。在 Help 菜單中,有一個 Procedure Browser,其中包含所有可用的函數的豐富詳盡文檔。
![GIMP Procedure Browser](/data/attachment/album/202102/06/231050qgwt5shy5ricchk4.png "GIMP Procedure Browser")
使用 GIMP 的批處理模式
你可以使用 -b
選項以批處理的方式啟動 GIMP。-b
選項的參數可以是你想要運行的腳本,或者用一個 -
來讓 GIMP 進入交互模式而不是命令行模式。正常情況下,當你啟動 GIMP 的時候,它會啟動圖形界面,但是你可以使用 -i
選項來禁用它。
開始編寫你的第一個腳本
創建一個名為 chalk.scm
的文件,並把它保存在 Preferences 窗口中 Folders 選項下的 Script 中指定的 script
文件夾下。就我而言,是在 $HOME/.config/GIMP/2.10/scripts
。
在 chalk.scm
文件中,寫入下面的內容:
(define (chalk filename grow-pixels spread-amount percentage)
(let* ((image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
(drawable (car (gimp-image-get-active-layer image)))
(new-filename (string-append "modified_" filename)))
(gimp-image-select-color image CHANNEL-OP-REPLACE drawable '(0 0 0))
(gimp-selection-grow image grow-pixels)
(gimp-context-set-foreground '(0 0 0))
(gimp-edit-bucket-fill drawable BUCKET-FILL-FG LAYER-MODE-NORMAL 100 255 TRUE 0 0)
(gimp-selection-none image)
(plug-in-spread RUN-NONINTERACTIVE image drawable spread-amount spread-amount)
(gimp-drawable-invert drawable TRUE)
(plug-in-randomize-hurl RUN-NONINTERACTIVE image drawable percentage 1 TRUE 0)
(gimp-file-save RUN-NONINTERACTIVE image drawable new-filename new-filename)
(gimp-image-delete image)))
定義腳本變數
在腳本中, (define (chalk filename grow-pixels spread-amound percentage) ...)
函數定義了一個名叫 chalk
的新函數。它的函數參數是 filename
、grow-pixels
、spread-amound
和 percentage
。在 define
中的所有內容都是 chalk
函數的主體。你可能已經注意到,那些名字比較長的變數中間都有一個破折號來分割。這是類 Lisp 語言的慣用風格。
(let* ...)
函數是一個特殊 過程 ,可以讓你定義一些只有在這個函數體中才有效的臨時變數。臨時變數有 image
、drawable
以及 new-filename
。它使用 gimp-file-load
來載入圖片,這會返回它所包含的圖片的一個列表。並通過 car
函數來選取第一項。然後,它選擇第一個活動層並將其引用存儲在 drawable
變數中。最後,它定義了包含圖像新文件名的字元串。
為了幫助你更好地了解該過程,我將對其進行分解。首先,啟動帶 GUI 的 GIMP,然後你可以通過依次點擊 Filters → Script-Fu → Console 來打開 Script-Fu 控制台。 在這種情況下,不能使用 let *
,因為變數必須是持久的。使用 define
函數定義 image
變數,並為其提供查找圖像的正確路徑:
(define image (car (gimp-file-load RUN-NONINTERACTIVE "Fourier.png" "Fourier.png")))
似乎在 GUI 中什麼也沒有發生,但是圖像已載入。 你需要通過以下方式來讓圖像顯示:
(gimp-display-new image)
![GUI with the displayed image](/data/attachment/album/202102/06/231050dd5romwuuwou1u5k.png "GUI with the displayed image")
現在,獲取活動層並將其存儲在 drawable
變數中:
(define drawable (car (gimp-image-get-active-layer image)))
最後,定義圖像的新文件名:
(define new-filename "modified_Fourier.png")
運行命令後,你將在 Script-Fu 控制台中看到以下內容:
![Script-Fu console](/data/attachment/album/202102/06/231050d10cb4bimb10zing.png "Script-Fu console")
在對圖像執行操作之前,需要定義將在腳本中作為函數參數的變數:
(define grow-pixels 2)
(define spread-amount 4)
(define percentage 3)
處理圖片
現在,所有相關變數都已定義,你可以對圖像進行操作了。 腳本的操作可以直接在控制台上執行。第一步是在活動層上選擇黑色。顏色被寫成一個由三個數字組成的列表,即 (list 0 0 0)
或者是 '(0 0 0)
:
(gimp-image-select-color image CHANNEL-OP-REPLACE drawable '(0 0 0))
![Image with the selected color](/data/attachment/album/202102/06/231051n9idg9lp3pv8iafg.png "Image with the selected color")
擴大選取兩個像素:
(gimp-selection-grow image grow-pixels)
![Image with the selected color](/data/attachment/album/202102/06/231051z870vffzmu8f8uru.png "Image with the selected color")
將前景色設置為黑色,並用它填充選區:
(gimp-context-set-foreground '(0 0 0))
(gimp-edit-bucket-fill drawable BUCKET-FILL-FG LAYER-MODE-NORMAL 100 255 TRUE 0 0)
![Image with the selection filled with black](/data/attachment/album/202102/06/231051l2nntint8k29iqug.png "Image with the selection filled with black")
刪除選區:
(gimp-selection-none image)
![Image with no selection](/data/attachment/album/202102/06/231052xic5hj50rjmz5r0e.png "Image with no selection")
隨機移動像素:
(plug-in-spread RUN-NONINTERACTIVE image drawable spread-amount spread-amount)
![Image with pixels moved around](/data/attachment/album/202102/06/231052gojzxa6a9v7z9aox.png "Image with pixels moved around")
反轉圖像顏色:
(gimp-drawable-invert drawable TRUE)
![Image with pixels moved around](/data/attachment/album/202102/06/231052teq5tomua5vdo5q5.png "Image with pixels moved around")
隨機化像素:
(plug-in-randomize-hurl RUN-NONINTERACTIVE image drawable percentage 1 TRUE 0)
![Image with pixels moved around](/data/attachment/album/202102/06/231052luneua1ebr9r6u66.png "Image with pixels moved around")
將圖像保存到新文件:
(gimp-file-save RUN-NONINTERACTIVE image drawable new-filename new-filename)
![Equations of the Fourier transform and its inverse](/data/attachment/album/202102/06/231053gdrxjhvwq4bqaxsj.png "Equations of the Fourier transform and its inverse")
傅立葉變換方程 (Cristiano Fontana, CC BY-SA 4.0)
以批處理模式運行腳本
現在你知道了腳本的功能,可以在批處理模式下運行它:
gimp -i -b '(chalk "Fourier.png" 2 4 3)' -b '(gimp-quit 0)'
在運行 chalk
函數之後,它將使用 -b
選項調用第二個函數 gimp-quit
來告訴 GIMP 退出。
了解更多
本教程向你展示了如何開始使用 GIMP 的內置腳本功能,並介紹了 GIMP 的 Scheme 實現:Script-Fu。如果你想繼續前進,建議你查看官方文檔及其入門教程。如果你不熟悉 Scheme 或 Lisp,那麼一開始的語法可能有點嚇人,但我還是建議你嘗試一下。這可能是一個不錯的驚喜。
via: https://opensource.com/article/21/1/gimp-scripting
作者:Cristiano L. Fontana 選題:lujun9972 譯者:amwps290 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive