【问题标题】:GIMP Python, selection based on path not the same as menu item "From Path"GIMP Python,基于路径的选择与菜单项“从路径”不同
【发布时间】:2017-03-19 14:43:57
【问题描述】:

我在 GIMP 2.8 中使用Select -> To Path 创建了具有多个路径的图像。现在我想创建一个 Python 脚本,它将遍历所有这些路径,根据每个路径进行选择,将选择剪切为新图像,做一些额外的事情, 并将每个剪辑保存到单独的 PNG 图像中。

到目前为止,我已经有了这个 Python 脚本,我可以从 Filters -> Paths 作为菜单项开始:

#!/usr/bin/env python
# coding: utf-8

from gimpfu import *
import os

def export_paths_to_pngs(img, layer, path, vis):

    # get all paths (internally called "vectors")
    cnt, vectors = pdb.gimp_image_get_vectors(img)
    if (cnt > 0):
        # iterate all paths
        for n in vectors:
            v = gimp.Vectors.from_id(n)
            # only visible paths
            if (v.visible):
                st = v.strokes
                sufix = 0
                # iterate all strokes in vector
                for ss in st:
                    type, num_pnts, cntrlpnts, closed = pdb.gimp_vectors_stroke_get_points(v, ss.ID)
                    pdb.gimp_image_select_polygon(img, CHANNEL_OP_REPLACE, len(cntrlpnts), cntrlpnts)

# tell gimp about our plugin
register(
    "python_fu_export_paths_to_png",
    "Export paths as png files",
    "Export paths as png files",
    "BdR",
    "BdR",
    "2017",
    "<Image>/Filters/Paths/Export paths to png", # menu path
    "",   # Create a new image, don't work on an existing one
    [
        (PF_DIRNAME, "export_directory", "Export destination directory", "/tmp"),
        (PF_TOGGLE, "p2",   "TOGGLE:", 1)       
    ],
    [],
    export_paths_to_pngs
)

main()

但是,问题在于 python 函数gimp_image_select_polygon 没有按预期进行选择。 选择似乎在贝塞尔曲线(或类似的东西)上有一些差异,这与它所基于的路径并不完全相同。 另一方面,菜单项From Path 确实可以正常工作,它会根据路径进行完美选择。见下图:

所以我的问题是:

  1. 菜单项Select -&gt; From Path和GimpPython函数gimp_image_select_polygon有什么区别
  2. 是我错误地使用了函数gimp_image_select_polygon,还是我应该使用其他函数?
  3. 如果失败了,有没有办法直接从 Python 调用菜单项 From Path

【问题讨论】:

    标签: python gimp python-fu


    【解决方案1】:

    不要使用

    pdb.gimp_image_select_polygon(...) 
    

    这意味着创建一个多边形选择(如“多边形”模式下的手绘选择)。你应该使用

    pdb.gimp_image_select_item(image,CHANNEL_OP_REPLACE,path) 
    

    (在整个路径上,无需逐笔进行)。

    PS:您在路径上迭代的代码非常做作。它通常很简单:

    for v in img.vectors:
       if v.visible:
    

    【讨论】:

    • 谢谢pdb.gimp_image_select_item 正是我想要的。还要感谢您指出简化的 for 循环。
    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多