Skip to content


RockSun的script-fu教程

前面的文章中我介绍了许多GIMP的自动化脚本,其中很多是修改自一些现成的脚本,只有最后的剪切脚本算是从头一点点写出来的,从中也摸索出来了编写这种脚本的一些思路。我发现,打好基础非常重要。

在这些脚本中使用的语言称为script-fu,而script-fu实际就是scheme语言,而scheme语言则出自非常有名的LISP语言。虽然scheme语言知道的人不多,但的确是一个拥有悠久历史的语言。以前敦促自己每年要学几门语言,没想到在这年末里可以小学一下scheme,或者说是script-fu。

首先说一下调试的环境,安装GIMP后,在启动的界面上运行“滤镜->Script-Fu->Console”,然后在弹出的窗口中输入“(+ 3 5)”,如果看到输出“8”,那么我们就完成了script-fu的第一个脚本。

语言的基本结构

通过前面的例子我们对script-fu的基本结构有了最基本的了解,所有的scritp-fu语句都是类似如下的结构:

(+ 3 5)

语句要用“(”和“)”包起来,这是必须的,这规定了语句的范围。在小括号中首先出现的是命令字,或者称为方法或函数名,后面跟的是参数,在上面的例子中是参数就是3和5。要实现4*(3+5)我们应该写为:

(* 4  (+ 3 5))

定义变量和函数

使用“let*”方法来定义变量,如下就是一个例子:

(let*
    (
         (a 1)
         (b 2)
    )
    (+ a b)
)

上面的脚本中定义了两个变量a和b,所有定义的变量都要放到let*后面的第一个小括号中,这个小括号中的每一个小括号都是一个变量的定义;而let*的结果则放在第二个括号里,上例中就是“(+ a b)”。要注意,变量a和b的有效范围只是在这第二个括号中,所以你使用a和b的代码就要全部放到这个括号里。

逻辑判断

(if (< n 0)
        (…)
        (…)
)

逻辑判断是编程语言不可缺少的一部分,在script-fu中也比较简单,上面的结构就是一个例子。if是语句名,后面紧跟三个小括号,第一个应该包含一个逻辑表达式,第二个括号则是表达式为true的时执行的语句,第三个括号则是表达式为false的时候执行的语句。

实践

根据上述信息和一些GIMP的知识,就可以写出我前面说的剪切脚本了,我们先看代码:

?View Code SCHEMA
(define (script-fu-rs-center-crop filename outfilename width height)
 
  (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
          (drawable (car (gimp-image-get-active-layer image))))
          (let* ((original-width (car (gimp-image-width image)))
               (original-height (car (gimp-image-height image)))
          )
 
               (if (&lt;= (/ original-width original-height) (/ width height))
                   (gimp-image-crop image original-width (* original-width (/ height width)) 0 (/ (- original-height (* original-width (/ height width))) 2) )
                   (gimp-image-crop image (* original-height (/ width height)) original-height (/ (- original-width (* original-height (/ width height))) 2) 0)
               )
           )
 
  (set! drawable (car (gimp-image-get-active-layer image)))
 
(gimp-file-save RUN-NONINTERACTIVE image drawable outfilename outfilename)
     (gimp-image-delete image)))

最外面是一个define语句,他后面的第一个括号就是执行这个脚本的参数,在这个例子中参数分别是处理的图片名、输出的图片名、期望比例的宽度和期望比例的长度。然后我们用let*定义了一些变量,分别是image和drawable,因为我们后面处理图片主要针对的就是drawable对象。

请注意第二个let*就是外面let*的值,而在第二个let*中我们又定义了两个参数,图片的长和宽。然后最后输出的值就是if语句的作用了,其中会判断图片和目标比例的关系,通过切割调整为目标比例。

看起来还比较简单的,如果要处理比较复杂的图像,在基本语言部分可能还需要学会使用数组,而在GIMP方面还需要知道图层,以及其他复杂的API。通过上面的介绍,希望大家就能看懂基本的script-fu脚本,并修改为自己所需要的功能了。

参考材料

Related posts:

  1. Gimp Crop Script
  2. Resize Image In Context Menu
  3. FTP image with Conext Menu
  4. Watermark: With GIMP Script
  5. 自己动手简化图片处理

Posted in blog. Tagged with , , , , .

0 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

Some HTML is OK

(required)

(required, but never shared)

or, reply to this post via trackback.