GIMP Python,基于路径的选择与菜单项不同 "From Path"

GIMP Python, selection based on path not the same as menu item "From Path"

我使用 Select -> To Path 在 GIMP 2.8 中创建了一个包含多个路径的图像。现在我想创建一个 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 -> From Path和GimpPython函数有什么区别gimp_image_select_polygon
  2. 我是否错误地使用了函数 gimp_image_select_polygon,或者我应该使用其他函数吗?
  3. 失败了,有没有办法直接从 Python 调用菜单项 From Path

不要使用

pdb.gimp_image_select_polygon(...) 

用于创建多边形选区(类似于 "polygon" 模式下的徒手选区)。你应该使用

pdb.gimp_image_select_item(image,CHANNEL_OP_REPLACE,path) 

(全程路径,无需一笔一笔)

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

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