вызов функции gimp-fu из внешнего модуля

Я пытаюсь написать своего рода библиотеку-оболочку для GIMP, чтобы упростить мои генеративные художественные проекты, но у меня возникла проблема со взаимодействием с gimpfu из моего модуля-оболочки. Следующий код плагина работает нормально и отображает изображение с горизонтальными линиями:

from gimpfu import *
from basicObjects import *

def newFilt() :
    img = gimp.Image(500, 500, RGB)
    background = gimp.Layer(img, "Background", 500, 500,RGB_IMAGE, 100, NORMAL_MODE)
    img.add_layer(background, 1)
    background.fill(BACKGROUND_FILL)
    pdb.gimp_context_set_brush('1. Pixel')
    pdb.gimp_context_set_brush_size(2)
    for i in range(100):
        Line= line([(0,5*i),(500,5*i)])
        pdb.gimp_pencil(background,Line.pointcount,Line.printpoints())
    gimp.Display(img)
    gimp.displays_flush()

register(
    "python_fu_render",
    "new Image",
    "Filters",
    "Brendan",
    "Brendan",
    "2016",
    "Render",
    "",
    [],
    [],
    newFilt, menu="<Image>/File/Create")

main()

класс «линия» определен в basicObjects и работает должным образом, однако, если я попытаюсь заменить «pdb.gimp_pencil (фон, Line.pointcount, Line.printpoints ())» на «Line.draw (фон)», и добавьте функцию draw() в класс линии как таковую:

from gimfu import *
class line:
    """creates a line object and defines functions specific to lines """
    def __init__(self, points):
        self.points = points
        self.pointcount = len(points)*2
    def printpoints(self):
        """converts point array in form [(x1,y1),(x2,y1)] to [x1,y1,x2,y2] as nessecary for gimp pdb calls"""
        output=[]
        for point in self.points:
            output.append(point[0])
            output.append(point[1])
        return output
    def draw(self,layer):
        pdb.gimp_pencil(layer,self.pointcount,self.printpoints())

изображение не визуализируется, и в консоли ошибок gimp не отображаются сообщения. Как я могу сделать вызов pdb из внешнего файла? Поможет ли как-то сделать обертку отдельным плагином?


person Brendan    schedule 06.05.2016    source источник


Ответы (3)


Во-первых: модуль gimp и gimp-fu работают только тогда, когда скрипт Python запускается как подключаемый модуль из GIMP. Я не знаю, что вы называете «внешним файлом», но точкой входа всегда должен быть подключаемый скрипт. Он может импортировать другие модули Python, как и любая обычная программа.

Во-вторых: подключаемые модули GIMP работают на Python 2.x (2.7 в наши дни) - и поэтому любой объявленный класс должен наследовать от object - объявление класса без наследования от объекта, как вы это делаете, только принесет вам неожиданные проблемы - хотя это может не быть вашей проблемой прямо сейчас.

Объявление класса выглядит нормально, но ваш пример при его вызове - нет - Line.draw(background), похоже, указывает, что вы пытаетесь вызвать метод для самого класса, а не для экземпляра вашего класса line.

person jsbueno    schedule 09.05.2016

Да, как уже указывалось, модуль gimpfu и gimp работает только из приложения gimp или с большим количеством взломов для создания дублирующей среды. Было бы так здорово запускать расширения и плагины gimp из скрипта без накладных расходов приложения gimp, но это в основном возможность иметь и есть свой пирог в то же время ситуация. Если вам не нужны все фильтры и эффекты, которые в изобилии доступны в gimp, вы можете рассмотреть модули PIL/Pillow. Они не достигают возможностей GIMP, но имеют все основные функции для работы с графическими изображениями. Они отлично работают в python2 или 3 и намного быстрее, чем gimp.

person Ismael Harun    schedule 06.06.2020

Да, было бы неплохо выполнить скрипт python-fu, хранящийся где-нибудь на диске, возможно, используя PYTHONPATH и DYLD_LIBRARY_PATH.

person Eric H.    schedule 07.06.2021