GIMP Python - заполнить путь / вектор цветом
Я пытаюсь разработать сценарий, который я могу запустить на открытых файлах SVG. Я хочу перебрать все пути и заполнить путь произвольным цветом (позже я заменю эту часть кода). Первым этапом этого является просто итерация по путям, и я не могу понять, как это сделать. Мой код ниже - почему я не вижу пути, по которому повторяются?
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from gimpfu import *
def plugin_main(image, layer, path):
vectors_count, vectors = pdb.gimp_image_get_vectors(image)
for n in vectors:
pdb.gimp_image_select_item(image,CHANNEL-OP-REPLACE,n)
foreground = pdb.gimp_context_get_foreground()
pdb.gimp_edit_fill(image.layers[0], foreground)
register(
"create_polygon_art",
"Fills all the paths with the average color within path",
"Fills all the paths with the average color within path",
"Bryton Pilling",
"Bryton Pilling",
"2018",
"<Image>/Filters/Fill all paths with average color",
"RGB*, GRAY*",
[],
[],
plugin_main
)
main()
Я также попробовал несколько различных подходов, которые я нашел, прибегая к помощи, в том числе используя что-то более простое для итерации, например:
for v in gimp.Vectors
Но независимо от того, что я пытаюсь, я не могу получить доказательства итерации по путям.
Я использую GIMP 2.10.6 на Windows 10 64-битной.
1 ответ
Это ловушка... pdb.gimp_image_get_vectors(image)
возвращает список целочисленных идентификаторов для путей, но более поздние вызовы требуют gimp.Vectors
объект.
image.vectors
это действительно список gimp.Vectors
и вы можете перебрать все пути с
for vector in image.vectors:
Больше проблем:
- Вы объявляете два аргумента в register(), но имеете три в своей функции. На практике вам не нужен аргумент пути, так как вы все равно собираетесь их итерировать.
- Аргумент layer вашей функции - это активный слой, когда вызывается плагин, и обычно это тот, который вы хотите нарисовать
gimp-edit-fill
берет источник цвета, а не цвет. Когда вы пойдете дальше со своим кодом, вам нужно будет установить цвет переднего плана и нажать / выскочить контекстCHANNEL-OP-REPLACE
не является допустимым символом Python, в Python вы должны использоватьCHANNEL_OP_REPLACE
(с подчеркиванием)
Две коллекции сценариев Python здесь и там.
Если вы находитесь под Windows, некоторые подсказки для отладки ваших скриптов здесь
Ваш код с исправлениями:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from gimpfu import *
def plugin_main(image, layer):
for p in image.vectors:
pdb.gimp_image_select_item(image,CHANNEL_OP_REPLACE,p)
pdb.gimp_edit_fill(layer, FOREGROUND_FILL)
register(
"create_polygon_art",
"Fills all the paths with the average color within path",
"Fills all the paths with the average color within path",
"Bryton Pilling",
"Bryton Pilling",
"2018",
"<Image>/Test/Fill all paths with average color",
"RGB*, GRAY*",
[],
[],
plugin_main
)
main()
Вы можете сделать свой код более удобным для пользователя, рисуя "штрихи" (таким образом, у вас есть один путь с несколькими штрихами). Если вам нужны отдельные выделения для штрихов, вы можете скопировать их во временный путь. Код для этого можно найти в некоторых скриптах в коллекциях выше.