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

(Cristiano Fontana,CC BY-SA 4.0)
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 程序浏览器 (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
的新函数,该函数接受以下参数:filename
、grow-pixels
、spread-amound
和 percentage
。define
函数内部的所有其他内容都是 chalk
函数的主体。您可能已经注意到,名称较长的变量在单词之间用破折号分隔;这是类似 Lisp 语言的惯用风格。
(let* ...)
函数是一个特殊的过程,允许您定义一些仅在主体内部有效的临时变量。在本例中,变量是 image
、drawable
和 new-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)

(Cristiano Fontana,CC BY-SA 4.0)
现在,获取活动图层并将其存储在 drawable
变量中
(define drawable (car (gimp-image-get-active-layer image)))
最后,定义图像的新文件名
(define new-filename "modified_Fourier.png")
这是在运行这些命令后您应该在 Script-Fu 控制台中看到的内容

(Cristiano Fontana,CC BY-SA 4.0)
在对图像执行操作之前,您需要定义将在脚本中定义为函数参数的变量
(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))

(Cristiano Fontana,CC BY-SA 4.0)
将选区扩大两个像素
(gimp-selection-grow image grow-pixels)

(Cristiano Fontana,CC BY-SA 4.0)
将前景色设置为黑色,并用它填充选区
(gimp-context-set-foreground '(0 0 0))
(gimp-edit-bucket-fill drawable BUCKET-FILL-FG LAYER-MODE-NORMAL 100 255 TRUE 0 0)

(Cristiano Fontana,CC BY-SA 4.0)
删除选区
(gimp-selection-none image)

(Cristiano Fontana,CC BY-SA 4.0)
随机移动像素
(plug-in-spread RUN-NONINTERACTIVE image drawable spread-amount spread-amount)

(Cristiano Fontana,CC BY-SA 4.0)
反转图像颜色
(gimp-drawable-invert drawable TRUE)

(Cristiano Fontana,CC BY-SA 4.0)
随机化像素
(plug-in-randomize-hurl RUN-NONINTERACTIVE image drawable percentage 1 TRUE 0)

(Cristiano Fontana,CC BY-SA 4.0)
将图像保存到新文件
(gimp-file-save RUN-NONINTERACTIVE image drawable new-filename new-filename)

傅里叶变换方程 (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,语法起初可能会有点吓人,但我建议您还是尝试一下。这可能会是一个惊喜。
评论已关闭。