编写 GIMP 脚本以加快图像处理速度

通过向一批图像添加效果来学习 GIMP 的脚本语言 Script-Fu。
92 位读者喜欢这篇文章。
Painting art on a computer screen

Opensource.com

不久前,我想给一个排版公式赋予黑板风格的外观。我开始尝试使用 GNU 图像处理程序 (GIMP),并对结果感到满意。问题是我必须对图像执行几个操作,我想再次使用这种风格,而且我不想为所有图像重复这些步骤。此外,我确信我很快就会忘记它们。

GIMP 是一款出色的开源图像编辑器。虽然我已经使用它多年,但我从未研究过它的批量处理能力及其 Script-Fu 菜单。这是探索它们的绝佳机会。

什么是 Script-Fu?

Script-Fu 是内置于 GIMP 中的脚本语言。它是 Scheme 编程语言的实现。如果您从未使用过 Scheme,请尝试一下,因为它非常有用。我认为 Script-Fu 是一个很好的入门方式,因为它对图像处理有立竿见影的效果,因此您可以很快感受到生产力。您也可以使用 Python 编写脚本,但 Script-Fu 是默认选项。

为了帮助您熟悉 Scheme,GIMP 的文档提供了一个 深入教程。Scheme 是一种类似 Lisp 的语言,因此主要特点是它使用 前缀表示法 和大量的 括号。函数和运算符通过前缀应用于操作数列表

(function-name operand operand ...)

(+ 2 3)
↳ Returns 5

(list 1 2 3 5)
↳ Returns a list containing 1, 2, 3, and 5

我花了一段时间才找到 GIMP 函数完整列表的文档,但实际上很简单。在帮助菜单中,有一个程序浏览器,其中包含关于所有可能函数的非常详尽和详细的文档。

GIMP Procedure Browser

GIMP 程序浏览器 (Cristiano Fontana,CC BY-SA 4.0)

访问 GIMP 的批量模式

您可以通过使用 -b 选项启用批量模式来运行 GIMP。-b 选项的参数可以是您要运行的脚本,也可以是破折号 (-),这会使 GIMP 在交互模式下启动,而不是在命令行模式下启动。通常,当您启动 GIMP 时,它会加载其图形用户界面 (GUI),但您可以使用 -i 选项禁用它。

编写您的第一个脚本

创建一个名为 chalk.scm 的文件,并将其保存到首选项窗口中文件夹 → 脚本下找到的 scripts 文件夹中。在我的例子中,它位于 $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 的新函数,该函数接受以下参数:filenamegrow-pixelsspread-amoundpercentagedefine 函数内部的所有其他内容都是 chalk 函数的主体。您可能已经注意到,名称较长的变量在单词之间用破折号分隔;这是类似 Lisp 语言的惯用风格。

(let* ...) 函数是一个特殊的过程,允许您定义一些仅在主体内部有效的临时变量。在本例中,变量是 imagedrawablenew-filename。它使用 gimp-file-load 加载图像,该函数返回包含图像的列表,然后使用 car 函数选择第一个条目。然后,它选择第一个活动图层,并将其引用存储在 drawable 变量中。最后,它定义包含结果图像新文件名的字符串。

为了帮助您更好地理解该过程,我将对其进行分解。首先,启用 GUI 和 Script-Fu 控制台启动 GIMP,Script-Fu 控制台位于过滤器 → Script-Fu → 控制台中。在本例中,您不能使用 let*,因为变量必须是持久的。使用 define 函数定义 image 变量,并为其提供查找图像的正确路径

(define image (car (gimp-file-load RUN-NONINTERACTIVE "Fourier.png" "Fourier.png")))

GUI 中似乎没有发生任何事情,但图像已加载。您需要使用以下命令启用图像显示

(gimp-display-new image)

现在,获取活动图层并将其存储在 drawable 变量中

(define drawable (car (gimp-image-get-active-layer image)))

最后,定义图像的新文件名

(define new-filename "modified_Fourier.png")

这是在运行这些命令后您应该在 Script-Fu 控制台中看到的内容

在对图像执行操作之前,您需要定义将在脚本中定义为函数参数的变量

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

将选区扩大两个像素

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

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 退出:gimp-quit

了解更多

本教程向您展示了如何开始使用 GIMP 的内置脚本功能,并介绍了 Script-Fu,GIMP 的 Scheme 实现。如果您想继续前进,我建议您查看官方文档及其 教程。如果您不熟悉 Scheme 或 Lisp,语法起初可能会有点吓人,但我建议您还是尝试一下。这可能会是一个惊喜。

接下来阅读什么
User profile image.
Cristiano L. Fontana 曾是意大利帕多瓦大学“伽利略·伽利莱”物理与天文系的 researchers,现在有了其他新的经历。

评论已关闭。

© . All rights reserved.