前面的文章中我介绍了许多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的知识,就可以写出我前面说的剪切脚本了,我们先看代码:
(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 (<= (/ 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脚本,并修改为自己所需要的功能了。
参考材料
- GIMP的script-fu教程:http://docs.gimp.org/en/gimp-using-script-fu-tutorial.html
- Schema语言的一本书:http://www.scheme.com/tspl2d/index.html
Related posts:
0 Responses
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.