| Profiel van 鉴鉴赏空间Foto'sWeblogLijsten | Help |
|
|
26 december MFC中常用类, 宏, 函数介绍(转载)//-----------------------------------------
常用类
CRect:用来表示矩形的类,拥有四个成员变量:top left bottom right。分别表是左上角和右下角的坐标。可以通过以下的方法构造:
下面介绍几个成员函数:
此外矩形可以和点(CPoint)相加进行位移,和另一个矩形相加得到“并”操作后的矩形。
CPoint:用来表示一个点的坐标,有两个成员变量:x y。 可以和另一个点相加。 CString:用来表示可变长度的字符串。使用CString可不指明内存大小,CString会根据需要自行分配。下面介绍几个成员函数:
CStringArray:用来表示可变长度的字符串数组。数组中每一个元素为CString对象的实例。下面介绍几个成员函数:
常用宏 RGB TRACE ASSERT VERIFY 常用函数 CWindApp* AfxGetApp(); HINSTANCE AfxGetInstanceHandle( ); HINSTANCE AfxGetResourceHandle( ); int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );用于弹出一个消息框
30 november 学用Gimp Script-FU编程 (转载)昨天闲来无事翻到一个前几天得贴子说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
说了现有的命令,下面看看怎么用script-FU来扩展gimp的功能。
下面是一段小代码,我先贴上来慢慢加注释。
拷贝粘贴存为一个文件放到目录 ~/.gimp-1.2/scripts/ (这个目录根据不同的版本会不一样哦,自己用TAB键试试就职到了。) 然后重起gimp或者选择菜单 xtns 》script-fu 》刷新 接着在任意一个图片上面点右键,选择 script-fu 》linuxsir 》draw circle
选择好你想用的颜色,选择圆心,半径,线宽。 源码:--------------------------------------------------------------------------------
; define 和下面看到的let是脚本里面基本的保留子 ; 世界上还有几个小教程可以看 在google上面找一下 ; script fu tutorial. 应该可以学会这些基本的语法. (define (doooom-draw-circle image drawable cx cy r thick)
; 这里dooom...circle是函数名 后面的几个参数是从
; 对话框传递过来的变量, 具体看下面的register (let* (
(up_corner_x (- cx r))
; up....x是被副职的变量,后面是副的值.
; (- cx r) 就是 cx-r 的意思. (up_corner_y (- cy r))
(height (* r 2)) ) (gimp-selection-clear image) ; 清空选区
(gimp-ellipse-select image (- up_corner_x thick) (- up_corner_y thick) (+ height (* thick 2)) (+ height (* thick 2)) 0 FALSE 0 0) ; 按照给定值选择一个椭圆选区 (gimp-ellipse-select image up_corner_x up_corner_y
height height 1 FALSE 0 0) ; 选择一个小一些的圆, 并且和前面的选区做"减"运算 (gimp-edit-fill drawable 0)
; 填充选区, 用前景色 (gimp-selection-clear image)
(gimp-displays-flush) ; 清除选区并且刷新图象 ; 如果不刷新图象是不会update到已有的变化的 ) ) ; ======================================== ; 下面的部分在你的gimp里面注册这个脚本 ; dooo...circle是你的程序入口, <image> 是说明添加到 ; 右键菜单, 后面是一层层的菜单名称, 可以随便写 ; 也就是说你的脚本可以作为一个entry添加到菜单的 ; 任何位置. (script-fu-register "doooom-draw-circle" "<Image>/Script-Fu/Linuxsir/Draw Circle..." "Draw a circle with given center and radius" "doooom at linuxsir" "doooom" "June 2003" "" SF-IMAGE "Image" 0 SF-DRAWABLE "Drawable" 0 SF-VALUE "Center X" "5" SF-VALUE "Center Y" "5" SF-VALUE "Radius" "4" SF-VALUE "Thick" "3" ) ; SF-image 和SF-DR... 是右键菜单脚本特有的 ; 他返回了当前操作的位置. 省下的很简单 ; 就是定义菜单和缺省值 -------------------------------------------------------------------------------- 另外我说一下, 脚本编写的问题, 你可以用任何的编辑器了哦。分号是注释。 我是把这些脚本存为扩展名为scm的文件,应该存成别的名字也行。 从gimp主菜单 xtns 》script-fu 》console 可以调出script的控制台。这里面可以实验你的语句。从控制台可以调出script列表,这个非常有用,看一下就知道了,嘿嘿。
调试脚本我没有什么特别好的方法,就是一句一句注释一下调试的,
有啥好方法,大生们多多赐教。 比如你可以画出这样的精确的东西,好象PS不太好做。
ps:如果看不到图,加一个出国代理。 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里面生效。
源码:--------------------------------------------------------------------------------
; 下面这个小routine是从yahoo的script-fu group抄来的 ; 有一些小改动, 注意这个里面使用了浮点数组, 嘿嘿 ; script 强吧. yahoo那个group不错, 可以看看 (define (script-drawline img xcoord ycoord xcoord2 ycoord2) (set! thecoords (cons-array 6 'double)) (aset thecoords 0 xcoord) (aset thecoords 1 ycoord) (aset thecoords 2 xcoord2) (aset thecoords 3 ycoord2) (gimp-pencil (car (gimp-image-active-drawable img)) 4 thecoords) ; 这里的 (car (gimp-image-active-drawable img)) 狠有用 ; 是从当前image提取drawable, 我还不太明白啥是drawable ; 但是有这个语句就无所谓了. (gimp-displays-flush) ) (define (draw-edge image sx sy fx fy)
(let* ( ; 下面是一堆付值和计算, 当笑话看吧, (distance (sqrt (+ (pow (- sx fx) 2) (pow (- fy sy) 2)))) (xstep (/ (- fx sx) 3)) (ystep (/ (- fy sy) 3)) (c1x (+ sx xstep)) (c1y (+ sy ystep)) (vertexx (- (+ c1x (/ xstep 2)) (* ystep 0.86603))) (vertexy (+ (+ c1y (/ ystep 2)) (* xstep 0.86603))) (c2x (+ c1x xstep)) (c2y (+ c1y ystep)) ) (if (> distance 1) ; if是一个狠tricky的语句, 费了我不少心思figure out 文档太少了 ; if 后面的是 逻辑判断, 一目了然, TRUE或者1 FALSE或者0 ; 逻辑判断后面的 ( ) 是如果为真的时候执行的语句 ; 不是象有一个xx文档说的是好几条, 只能有一条哦. ; (begin .... ) 的结构是符合语句 ; 然后在后面第二个 ( ) 是else时候执行的. (begin (script-drawline image c1x c1y sx sy) (script-drawline image c2x c2y fx fy) (draw-edge image vertexx vertexy c2x c2y) (draw-edge image c1x c1y vertexx vertexy) ; 调用画线的程序和递归. )) ) ) (define (doooom-fractal-art width)
(let* ((image (car (gimp-image-new width (/ width 3) RGB))) (layer (car (gimp-layer-new image width (/ width 3) RGB-IMAGE "foobar" 100 NORMAL-MODE))) ) (gimp-drawable-fill layer BG-IMAGE-FILL) (gimp-image-add-layer image layer 0) (gimp-display-new image) ; 前面这一部分也是抄的, 建立一个新图象, 加一个新layer ; 具体可以参见那个文档,你肯定从google里面找到了 ; 因为一共就那么几个文档, 呵呵 (draw-edge image 0 4 (- width 1) 4 ) (gimp-displays-flush) ) ) ; ===================================== ; <toolbox> 是注册在主菜单的意思, 后面随意 (script-fu-register "doooom-fractal-art" "<Toolbox>/Xtns/Script-Fu/Linuxsir/Fractal Art..." "Draw some fractal art blah blah" "doooom at linuxsir" "doooom" "June 2003" "" SF-VALUE "Canvas Width" "300" ) --------------------------------------------------------------------------------
执行的时候,在菜单选择 xtns 》 script-fu 》linuxsir 》fractal art,然后指定想要的图片宽度,还有就是指定好颜色和画笔,建议用小点的笔头哦。
接着我们再看一个叫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,选择你要输出的文件和运动半径,指定好画笔和颜色。
源码:--------------------------------------------------------------------------------
; 这个routine和前面画线的是一起ref来的.呵呵
(define (script-setdot img xcoord ycoord) (set! thecoords (cons-array 4 'double)) (aset thecoords 0 xcoord) (aset thecoords 1 ycoord) (gimp-paintbrush (car (gimp-image-active-drawable img)) 0 2 thecoords 0 0) ) (define (doooom-little-anim r outfile)
(let* ((image (car (gimp-image-new (* r 3) (* r 3) RGB))) (layer 0) (cx (* r 1.5)) (cy (* r 1.5)) (x 1) (y 1) (angularstep (/ (* 3.1415926 2) 30)) (ang 0) ) (gimp-display-new image) ; 好象没什么好说的了,这个是while循环,呵呵
(while (< ang (* 3.14 2)) (set! layer (car (gimp-layer-new image (* r 3) (* r 3) RGB-IMAGE "foobar" 100 NORMAL-MODE))) (gimp-drawable-fill layer BG-IMAGE-FILL) (gimp-image-add-layer image layer 0) (set! x (+ cx (* r (sin ang)))) (set! y (+ cy (* r (cos ang)))) (script-setdot image x y) (set! ang (+ ang angularstep)) ) (gimp-convert-indexed image 1 0 256 0 0 "") ; 这个是转换成所有色图象, 只有这样才可以保存成gif (file-gif-save 1 image (car (gimp-image-active-drawable image)) outfile outfile TRUE 1 0 0) ; 里面第一个参数是run_mod 如果是0 的话, gimp会弹出窗口 ; 1 不会弹出,按照你命令的设置直接执行了. (gimp-displays-flush) ) ) (script-fu-register "doooom-little-anim"
"<Toolbox>/Xtns/Script-Fu/Linuxsir/Little Anim..." "compose a gif animation of a rolling point in circular track." "doooom at linuxsir" "doooom" "July 2003" "" SF-VALUE "Radius" "100" SF-STRING "Output File" "anim.gif" ) --------------------------------------------------------------------------------
finish |
|
|