LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 9102|回复: 33

学用Gimp,从画圆到script-FU编程。

[复制链接]
发表于 2003-7-2 14:46:25 | 显示全部楼层 |阅读模式
昨天闲来无事翻到一个前几天得贴子说gimp不能画圆,然后有兄弟比较PS和gimp孰优孰劣。
其实这两个软件各有所长,PS的新版本非常强大,gimp总体比较我觉得优于PS5,用起来没有PS6那么舒服了。

PS在路经的功能方面比gimp强很多。而gimp有script-FU做基础也不输给PS的其他方面多少,甚至说script的扩展性使得gimp给予使用者更多的自己发挥的空间。你可以在gimp上面完成很多在PS下面不可完成的任务。

我要写有关script的东西,但是既然提到了画圆,先说说怎么简单的画一些图形。

比如我要画圆
1. 用圆形选择工具画出你想画的形状。
2. 选择颜色和画笔
3. 在图片上面右键,选择  编辑》勾画
(如果要精确一些的话,可以在圆形选取的时候打开“工具配置”给圆形选区指定固定的宽高比例。)

这是第一种方法,有gimp丰富的可随意扩展的画笔做后盾,你可以画出很多有意思的东西

第二中方法。
1. 建立圆形选区
2. 在图片上面右键   选择 》边界
3. 指定你要勾画的线宽
4. 图片右键   编辑 》填充

附件里面是一个用这些方法画出来的东西,其实在PS5里面我记得没有画圆工具想画一个圆挺麻烦的。相比之下gimp要比ps5强一些

注:gimp版本1.2

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2003-7-2 14:47:35 | 显示全部楼层
说了现有的命令,下面看看怎么用script-FU来扩展gimp的功能。

下面是一段小代码,我先贴上来慢慢加注释。
拷贝粘贴存为一个文件放到目录
~/.gimp-1.2/scripts/
(这个目录根据不同的版本会不一样哦,自己用TAB键试试就职到了。)
然后重起gimp或者选择菜单 xtns 》script-fu 》刷新

接着在任意一个图片上面点右键,选择 script-fu 》linuxsir 》draw circle
选择好你想用的颜色,选择圆心,半径,线宽。


  1. ; define 和下面看到的let是脚本里面基本的保留子
  2. ; 世界上还有几个小教程可以看 在google上面找一下
  3. ; script fu tutorial. 应该可以学会这些基本的语法.

  4. (define (doooom-draw-circle image drawable cx cy r thick)

  5. ; 这里dooom...circle是函数名 后面的几个参数是从
  6. ; 对话框传递过来的变量, 具体看下面的register

  7. (let* (

  8. (up_corner_x (- cx r))

  9. ; up....x是被副职的变量,后面是副的值.
  10. ; (- cx r) 就是 cx-r 的意思.

  11. (up_corner_y (- cy r))
  12. (height (* r 2))
  13.         )

  14.         (gimp-selection-clear image) ; 清空选区
  15.         (gimp-ellipse-select image (- up_corner_x thick) (- up_corner_y thick)
  16.                 (+ height (* thick 2)) (+ height (* thick 2)) 0 FALSE 0 0)
  17. ; 按照给定值选择一个椭圆选区

  18.         (gimp-ellipse-select image up_corner_x up_corner_y
  19.         height height 1 FALSE 0 0)
  20. ; 选择一个小一些的圆, 并且和前面的选区做"减"运算

  21.         (gimp-edit-fill drawable 0)
  22. ; 填充选区, 用前景色

  23.         (gimp-selection-clear image)
  24.    (gimp-displays-flush)
  25. ; 清除选区并且刷新图象
  26. ; 如果不刷新图象是不会update到已有的变化的
  27.         )
  28.         )
  29. ; ========================================
  30. ; 下面的部分在你的gimp里面注册这个脚本
  31. ; dooo...circle是你的程序入口, <image> 是说明添加到
  32. ; 右键菜单, 后面是一层层的菜单名称, 可以随便写
  33. ; 也就是说你的脚本可以作为一个entry添加到菜单的
  34. ; 任何位置.
  35. (script-fu-register "doooom-draw-circle"
  36.                 "<Image>/Script-Fu/Linuxsir/Draw Circle..."
  37.                 "Draw a circle with given center and radius"
  38.                 "doooom at linuxsir"
  39.                 "doooom"
  40.                 "June 2003"
  41.                 ""
  42.                 SF-IMAGE "Image" 0
  43.                 SF-DRAWABLE "Drawable" 0
  44.                 SF-VALUE "Center X" "5"
  45.                 SF-VALUE "Center Y" "5"
  46.                 SF-VALUE "Radius" "4"
  47.                 SF-VALUE "Thick" "3"
  48.                 )
  49. ; SF-image 和SF-DR... 是右键菜单脚本特有的
  50. ; 他返回了当前操作的位置. 省下的很简单
  51. ; 就是定义菜单和缺省值
复制代码


另外我说一下, 脚本编写的问题, 你可以用任何的编辑器了哦。分号是注释。
我是把这些脚本存为扩展名为scm的文件,应该存成别的名字也行。

从gimp主菜单 xtns 》script-fu 》console 可以调出script的控制台。这里面可以实验你的语句。从控制台可以调出script列表,这个非常有用,看一下就知道了,嘿嘿。

调试脚本我没有什么特别好的方法,就是一句一句注释一下调试的,
有啥好方法,大生们多多赐教。

比如你可以画出这样的精确的东西,好象PS不太好做。

ps:如果看不到图,加一个出国代理。
 楼主| 发表于 2003-7-2 14:49:15 | 显示全部楼层
script-fu就是一系列gimp动作,会photoshop的兄弟会说我们可以在ps里面用action同样可以记录动作而且狠方便,调节度也很大。但是script-fu作为从lisp衍生出来的一种东东,功能远不止是批处理。

你可以在script里面实现数学计算,if,while流程控制,甚至是子程序调用。下面看看怎么用了哦。NOW WE CAN START REAL ROCK&ROLL。HEI HEI

下面这个代码是一个简单的递归调用绘制一个分形图案 ( PS卫道者要吐血了 ),很久不写程序了各位学CS的大哥不要因为丑陋的代码来砍我。

还是拷贝到那个目录,然后更新script-fu,这里我随便插一句,你每次改动了你的脚本的时候都要更新script,才可以在gimp里面生效。


  1. ; 下面这个小routine是从yahoo的script-fu group抄来的
  2. ; 有一些小改动, 注意这个里面使用了浮点数组, 嘿嘿
  3. ; script 强吧.  yahoo那个group不错, 可以看看
  4. (define (script-drawline img xcoord ycoord xcoord2 ycoord2)
  5. (set! thecoords (cons-array 6 'double))
  6. (aset thecoords 0 xcoord)
  7. (aset thecoords 1 ycoord)
  8. (aset thecoords 2 xcoord2)
  9. (aset thecoords 3 ycoord2)
  10. (gimp-pencil (car (gimp-image-active-drawable img)) 4 thecoords)
  11. ; 这里的 (car (gimp-image-active-drawable img)) 狠有用
  12. ; 是从当前image提取drawable, 我还不太明白啥是drawable
  13. ; 但是有这个语句就无所谓了.
  14. (gimp-displays-flush)
  15.   )

  16. (define (draw-edge image sx sy fx fy)
  17.         (let* ( ; 下面是一堆付值和计算, 当笑话看吧,
  18.                         (distance (sqrt (+ (pow (- sx fx) 2)
  19.                                 (pow (- fy sy) 2))))
  20.                         (xstep (/ (- fx sx) 3))
  21.                         (ystep (/ (- fy sy) 3))
  22.                         (c1x (+ sx xstep))
  23.                         (c1y (+ sy ystep))
  24.                         (vertexx (- (+ c1x (/ xstep 2)) (* ystep 0.86603)))
  25.                         (vertexy (+ (+ c1y (/ ystep 2)) (* xstep 0.86603)))
  26.                         (c2x (+ c1x xstep))
  27.                         (c2y (+ c1y ystep))
  28.                         )
  29.                         (if (> distance 1)
  30. ; if是一个狠tricky的语句, 费了我不少心思figure out 文档太少了 :(
  31. ; if 后面的是 逻辑判断, 一目了然, TRUE或者1 FALSE或者0
  32. ; 逻辑判断后面的 ( ) 是如果为真的时候执行的语句
  33. ; 不是象有一个xx文档说的是好几条, 只能有一条哦.
  34. ; (begin .... ) 的结构是符合语句
  35. ; 然后在后面第二个 ( ) 是else时候执行的.
  36.                                 (begin
  37.                                 (script-drawline image c1x c1y sx sy)
  38.                                 (script-drawline image c2x c2y fx fy)
  39.                                 (draw-edge image vertexx vertexy c2x c2y)
  40.                                 (draw-edge image c1x c1y vertexx vertexy)
  41. ; 调用画线的程序和递归.        
  42.                         ))
  43.                         )
  44.         )

  45. (define (doooom-fractal-art width)
  46. (let* ((image (car (gimp-image-new width (/ width 3) RGB)))
  47.         (layer (car (gimp-layer-new image width (/ width 3)
  48.                      RGB-IMAGE "foobar" 100 NORMAL-MODE)))        )
  49.        (gimp-drawable-fill layer BG-IMAGE-FILL)
  50.        (gimp-image-add-layer image layer 0)
  51.        (gimp-display-new image)
  52. ; 前面这一部分也是抄的, 建立一个新图象, 加一个新layer
  53. ; 具体可以参见那个文档,你肯定从google里面找到了
  54. ; 因为一共就那么几个文档, 呵呵
  55.         (draw-edge image 0  4 (- width 1) 4 )
  56.         (gimp-displays-flush)
  57.         )
  58.         )
  59. ; =====================================
  60. ; <toolbox> 是注册在主菜单的意思, 后面随意
  61. (script-fu-register "doooom-fractal-art"
  62.                 "<Toolbox>/Xtns/Script-Fu/Linuxsir/Fractal Art..."
  63.                 "Draw some fractal art blah blah"
  64.                 "doooom at linuxsir"
  65.                 "doooom"
  66.                 "June 2003"
  67.                 ""
  68.                 SF-VALUE "Canvas Width" "300"
  69.                 )

复制代码

执行的时候,在菜单选择 xtns 》 script-fu 》linuxsir 》fractal art,然后指定想要的图片宽度,还有就是指定好颜色和画笔,建议用小点的笔头哦。

执行结果:

 楼主| 发表于 2003-7-2 14:50:23 | 显示全部楼层
接着我们再看一个叫PS fans彻底FT的script ( 我可不是gimp卫道者哦,PS狠不错的,但是也狠贵,别说盗版,你试试在ebay上卖一个盗版PS7,保准送你去消声客监狱 )。

gimp可以将每一个layer的图象作为gif或者video (mpeg1/2)的一桢来输出。这样我们可以使用gimp来制作mpg或者gif动画。mpg需要安装一些软件和script。这里说说做gif。

下面是一个简单的脚本,说简单是我没有在里面加入复杂的动作(比较懒),只是做了一个圆周运动的东东。如果你喜欢你可以用脚本写出来,九大星星的运动轨道,或者xxxx,反正能编程了上么写不出呢?这里只是show一下script的潜力。

还是一样在 xtns 》linuxsir 脚本anim,选择你要输出的文件和运动半径,指定好画笔和颜色。



  1. ; 这个routine和前面画线的是一起ref来的.呵呵
  2. (define (script-setdot img xcoord ycoord)
  3. (set! thecoords (cons-array 4 'double))
  4. (aset thecoords 0 xcoord)
  5. (aset thecoords 1 ycoord)
  6. (gimp-paintbrush (car (gimp-image-active-drawable img))
  7.         0 2 thecoords 0 0)
  8. )

  9. (define (doooom-little-anim r outfile)
  10. (let* ((image (car (gimp-image-new (* r 3) (* r 3) RGB))) (layer 0)
  11.                 (cx (* r 1.5))
  12.                 (cy (* r 1.5))
  13.                 (x 1) (y 1)
  14.                 (angularstep (/ (* 3.1415926 2) 30))
  15.                 (ang 0)
  16.                 )
  17.         (gimp-display-new image)

  18. ; 好象没什么好说的了,这个是while循环,呵呵
  19.         (while (< ang (* 3.14 2))
  20.                 (set! layer (car (gimp-layer-new image (* r 3) (* r 3)
  21.                      RGB-IMAGE "foobar" 100 NORMAL-MODE)))
  22.                 (gimp-drawable-fill layer BG-IMAGE-FILL)
  23.                 (gimp-image-add-layer image layer 0)
  24.                 (set! x (+ cx (* r (sin ang))))
  25.                 (set! y (+ cy (* r (cos ang))))
  26.                 (script-setdot image x y)
  27.                 (set! ang (+ ang angularstep))
  28.                 )
  29.         (gimp-convert-indexed image 1 0 256 0 0 "")
  30. ; 这个是转换成所有色图象, 只有这样才可以保存成gif
  31.         (file-gif-save 1 image  (car (gimp-image-active-drawable image))
  32.                  outfile outfile TRUE 1 0 0)
  33. ; 里面第一个参数是run_mod 如果是0 的话, gimp会弹出窗口
  34. ; 1 不会弹出,按照你命令的设置直接执行了.
  35.         (gimp-displays-flush)
  36.         )
  37.         )

  38. (script-fu-register "doooom-little-anim"
  39.                 "<Toolbox>/Xtns/Script-Fu/Linuxsir/Little Anim..."
  40.                 "compose a gif animation of a rolling point in circular track."
  41.                 "doooom at linuxsir"
  42.                 "doooom"
  43.                 "July 2003"
  44.                 ""
  45.                 SF-VALUE "Radius" "100"
  46.                 SF-STRING "Output File" "anim.gif"
  47.                 )

复制代码


输出成这样,嘿嘿, " ~~~拉拉~~我是一个青椒~椒~椒~椒椒椒~~~~~"

发表于 2003-7-2 15:06:54 | 显示全部楼层
谢谢兄弟的方法了。:)
我也发两个我做的。做的不好
发表于 2003-7-2 15:09:42 | 显示全部楼层
最初由 wide288 发表
谢谢兄弟的方法了。:)
我也发两个我做的。做的不好
发表于 2003-7-2 15:34:49 | 显示全部楼层
doooom 兄你的第一个脚本试成功了吗,我怎么加不上脚本呢。
还有脚本的基础语法那有介绍啊。
 楼主| 发表于 2003-7-2 15:41:34 | 显示全部楼层
呵呵,这个可要到google上面好好找了,写这几个东西可费了些功夫,主要是很多小地方只能自己实验,没有上么现成的文档。:(
我在代码里面加些注释吧。

你要拷贝到正确的目录,还有要刷新script。第一个调用是在图片的右键菜单里面,后面两个在主菜单里面。
发表于 2003-7-2 15:49:50 | 显示全部楼层
doooom是偶像啊,这几篇太cool了!
发表于 2003-7-2 15:54:40 | 显示全部楼层
我照着第一个 script-fu 》linuxsir 》draw circle
这样做的,在/home/wide288/.gimp-1.2/scripts/linuxsir/draw_circle
中写了这个可是在script-fu 》linuxsir 》draw circle中找不到 linuxsir

我看可能是还要改许多的东西。如:
pluginrc
改上面这个文件
plug-ins:
加到上面这个目录里。

不对,是我理解错了,我找到资料了。

www.gimp.org
正在看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表