代码之家  ›  专栏  ›  技术社区  ›  Pierre

gimp脚本fu:画一条简单的线

  •  3
  • Pierre  · 技术社区  · 6 年前

    我正在尝试使用gimp脚本画一条线。在以下脚本中:我创建了一个新图像512x512,并尝试绘制对角线(0,0)->(512,512). 但图像(tmp.xcf)保持透明。

    我做错了什么?

    (define (drawdiagonal W H)
    (let* (
          (img 0)
           (bg 0)
           (points (cons-array 4 'double) )
          )
    (set! img (car (gimp-image-new  W H 0)))
    (gimp-image-undo-group-start img)
    (gimp-context-push)
    (set! bg (car (gimp-layer-new img  W H RGBA-IMAGE "background" 100 NORMAL-MODE)))
    (gimp-image-add-layer img bg 0)
    (gimp-drawable-set-visible bg TRUE)
    (gimp-image-set-active-layer img bg)
    (gimp-context-set-brush-size 10.0)
    (gimp-context-set-opacity 100)
    (gimp-context-set-paint-mode NORMAL-MODE)
    (gimp-context-set-foreground '(255 127 0))
    (gimp-selection-all img)
    
    (aset points 0 0)
    (aset points 1 0)
    (aset points 2 W)
    (aset points 3 H)
    (gimp-paintbrush-default  bg 4 points)
    
    (gimp-context-pop)
    (gimp-image-undo-group-end img)
    
    (gimp-xcf-save 1 img img "tmp.xcf"  "tmp.xcf")
    (display "DONE")
    )
    )
    
    (drawdiagonal 512 512) (gimp-quit 0)
    

    用法:

    cat test.scm | gimp -i  -b -
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   xenoid    6 年前

    看来你大部分都没找到:

    (gimp-context-set-brush "Some brush")
    

    此外,第三个参数(第二个 img )应为可抽出式:

    (gimp-xcf-save 1 img img "tmp.xcf"  "tmp.xcf")
    

    PS:帮自己一个忙,用Python编写脚本。看见 here 例如。

    编辑后Gimp 2.10:现在有了一个API,可以在“线”模式下绘制路径,这是获得清晰结果的最佳方式。相关电话包括:

    pdb.gimp_context_set_stroke_method(STROKE_LINE)
    pdb.gimp_context_set_line_cap_style(...)
    pdb.gimp_context_set_line_join_style(...)
    pdb.gimp_context_set_line_miter_limit(...)
    pdb.gimp_context_set_line_width(width)
    pdb.gimp_drawable_edit_stroke_item(drawable, path)
    
        2
  •  1
  •   Jack Punt    2 年前

    对于后来可能出现的人,根据xenoid的提示,我用gimp铅笔制作了这个。

    [我没有找到gimp\u drawable\u edit\u stroke\u项目的“项目/路径”文档]

    可以调整为使用gimp笔刷。。。

    (define (util-draw-path drawable args . path)
      ;; Draw a zig-zag line:
      ;; (util-draw-path layer `((width 10) (color ,RED)) 10 50 40 80 70 30 110 90 150 80)
      (let ((save  (util-assq 'save args) #t)
            (color (util-assq 'color args))   ; else use context value
            (width (util-assq 'width args))   ; else use context value
            (miter (util-assq 'miter args))   ; else use context value
            (join  (util-assq 'join args))    ; else use context value
            (cap   (util-assq 'cap args))     ; else use context value
            (stroke (util-assq 'stroke args)) ; else use context value
            )
        (and save (gimp-context-push))
        (and miter (gimp-context-set-line-miter-limit miter)) ; default: 10, default mitre up to 60 pixels
        (and stroke (gimp-context-set-stroke-method stroke))  ; default STROKE-PAINT-METHOD
        (and cap (gimp-context-set-line-cap-style cap))       ; CAP-ROUND, CAP-SQUARE
        (and join (gimp-context-set-line-join-style join))    ; JOIN-MITER, JOIN-ROUND, JOIN-BEVEL
        (and color (gimp-context-set-foreground color))       ;
        (and width (gimp-context-set-line-width width))       ; default: 6
    
        (let ((vec (apply vector path)))
          (gimp-pencil drawable (vector-length vec) vec))
        (and save (gimp-context-pop))
        ))
    
    ;;; (util-assq key list [default]) -> value or [default or #f]
    (macro (util-assq form)
      (let ((key (cadr form)) (lis (caddr form))
            (els (if (pair? (cdddr form)) (cadddr form) #f)))
        `(let ((v (assq ,key ,lis)))
           (if v (cadr v) ,els))))