Экспортируйте все пути SVG с помощью плагина Gimp Python

Я хочу написать плагин Gimp-Python для экспорта всех путей SVG из текущего изображения. Это кажется довольно простым, но я застрял с вызовами pdb, возможно, я не вызываю процедуры правильно, поэтому мне нужна ваша помощь.

Вот мой код:

#!/usr/bin/env python

from gimpfu import *

def exportToSvg(img, layer) :
    gimp.pdb.vectors_export_to_file(img,"C:/Users/Public/Documents/output.svg",0)

register(
    "ExportToSvg",    
    "Export all SVG paths",   
    "Export all SVG paths from current image",
    "My Name", 
    "My company", 
    "2015",
    "<Image>/MyScripts/Export to svg", 
    "*", 
    [], 
    [],
    exportToSvg)

main()

После открытия Gimp и загрузки изображения, когда я нажимаю на свой плагин, я получаю эту ошибку:

Ошибка при вызове "gimp-процедурный-db-proc-info": процедура "векторы-экспорт-в-файл" не найдена

Когда я ищу в Gimp PDB, я могу найти "gimp-vectors-export-to-file", так в чем же проблема? Как мне назвать эту процедуру?

3 ответа

Решение

Вы почти там - модуль "pdb" только что выставлен на уровне модуля с from gimpfu import * так что делать не надо gimp.pdb.<procname> - просто pdb.<procname> (это будет работать, хотя).

Но что на самом деле вызывает вашу ошибку, так это то, что процедура на самом деле называетсяgimp_vectors_export_to_file - и не vectors_export_to_file-

Вы должны называть это как:

pdb.gimp_vectors_export_to_file(img,"C:/Users/Public/Documents/output.svg",None)

Также обратите внимание, что для большинства вызовов PDB, требующих целочисленных идентификаторов элементов изображения, вы должны вместо этого передать соответствующий объект Python, представляющий этот элемент. Объект "Векторы" для сохранения отдельных векторов получается путем вызова других функций PDB. Для сохранения всех векторов вместо "0", указанного в описании функции, передайте None,

NB: есть интерактивная консоль Python, доступ к которой можно получить с помощью filters->python->console - гораздо проще кодировать эти плагины и скрипты, если сначала вы тестируете свои вызовы pdb и манипуляции с изображениями в интерактивном режиме.

Чтобы получить ссылку на ваше изображение в интерактивной консоли, введите:

img = gimp.image_list()[0]

Я адаптировал этот вопрос в плагин gimp python, который представляет эту функциональность как формат экспорта svg.

Я превратил это в суть, просьба тянуть приветствуется, суть может быть более интересным, чем этот ответ.

https://gist.github.com/thorsummoner/3ad6f806f1c08246f240222a3c0a5c47

Скопируйте этот источник в каталог плагинов gimp (и сделайте его исполняемым).

В моей системе это ~/.gimp-2.8/plug-ins/file-svg-export.pyНа окнах его, вероятно, где-то в %appdata%,

#!/usr/bin/env python

# GIMP Plug-in for Simple SVG Exports

# Copyright (C) 2016 by Dylan Grafmyre <thorsummoner@live.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.

# based on an openraster plugin by 
# https://git.gnome.org/browse/gimp/tree/plug-ins/pygimp/plug-ins/file-openraster.py?h=GIMP_2_8_16

import gimpfu

def register_save_handlers():
    gimpfu.gimp.register_save_handler('file-svg-save', 'svg', '')

def save_svg(img, drawable, filename, raw_filename):
    gimpfu.gimp.pdb.gimp_vectors_export_to_file(img, filename, None)

gimpfu.register(
    'file-svg-save', #name
    'save an SVG (.svg) file', #description
    'save an SVG (.svg) file',
    'Dylan Grafmyre', #author
    'Dylan Grafmyre', #copyright
    '2016', #year
    'SVG',
    '*',
    [   #input args. Format (type, name, description, default [, extra])
        (gimpfu.PF_IMAGE, "image", "Input image", None),
        (gimpfu.PF_DRAWABLE, "drawable", "Input drawable", None),
        (gimpfu.PF_STRING, "filename", "The name of the file", None),
        (gimpfu.PF_STRING, "raw-filename", "The name of the file", None),
    ],
    [], #results. Format (type, name, description)
    save_svg, #callback
    on_query = register_save_handlers,
    menu = '<Save>'
)

gimpfu.main()

Использовать просто File -> Export As, your file.svg

Он экспортирует все пути в один файл SVG.

Технически это не решает проблему с помощью плагина Python, но для тех, кто оказался здесь, потому что хотел экспортировать все пути сразу, GIMP позволяет экспортировать все пути без каких-либо плагинов.

Чтобы экспортировать все пути, а не один путь, щелкните правой кнопкой мыши любой путь, выберите «Экспортировать путь...» и измените параметр в окне с «Экспортировать активный путь» на «Экспортировать все пути из этого изображения».

Протестировано с GIMP версии 2.8 и 2.10.

Другие вопросы по тегам