Как в Gimp 3 использовать Curves_spline и HISTOGRAM_VALUE в плагинах Python-Fu? [закрыто]Python

Программы на Python
Ответить
Anonymous
 Как в Gimp 3 использовать Curves_spline и HISTOGRAM_VALUE в плагинах Python-Fu? [закрыто]

Сообщение Anonymous »

В настоящее время я пытаюсь обновить некоторые плагины Python с Gimp 2.10.x до Gimp 3.0.6 (Windows). Это намного сложнее, чем я думал.
Я разместил пример кода для одного из плагинов в конце этого вопроса (потому что он довольно длинный). Этот код должен работать в Gimp 3 Python-Fu. Он должен просмотреть все открытые файлы изображений и применить к гистограмме сплайновую кривую, еще больше осветляя те части каждого изображения, которые и без того яркие.
Код в целом работает. Примечательно, что новый пункт меню появляется в ожидаемом месте, и при нажатии на него, когда открыто хотя бы одно изображение, выполняется процедура whiten_all.
Однако у меня есть три проблемы:
1:

Я должен передать 0 в качестве второго параметра в Curves_spline, что является плохим стилем. Вместо этого было бы лучше использовать символическую константу. Я изучил документацию и заглянул в браузер процедур. В первом случае константа указана как GIMP_HISTOGRAM_VALUE, а во втором — как HISTOGRAM-VALUE (т. е. с дефисом вместо подчеркивания и без начального GIMP). Ни один из синтаксисов не работает.
Я также пробовал такие вещи, как Gimp.HISTOGRAM_VALUE и множество подобных вариантов, но безуспешно. Каждый раз GIMP жалуется, что имя не определено.
Какой синтаксис будет правильным для замены 0 (второго параметра) в вызове Curves_spline на символ HISTOGRAM_VALUE?
[ Примечание. В GIMP 2 HISTOGRAM_VALUE был правильным. ]
2:

В GIMP 2 у нас была функция pdb.gimp_image_get_active_drawable(image) для получения активной возможности рисования из изображения. Похоже, эта функция была удалена из GIMP 3 и замены ей нет. По крайней мере, за несколько часов исследований мне не удалось найти замену.
Решением этой проблемы обычно является что-то вроде drawable = Gimp.Image.get_selected_drawables(image)[0] или drawable = Gimp.Image.get_layers(image)[0] или просто drawable = drawables[0] (в последнем случае drawables — это просто один из параметров функции для whiten_all).
Однако у этих решений есть недостатки:
Обычно при запуске whiten_all на изображениях ничего не выделяется, поэтому я не уверен, что на самом деле представляет собой возвращаемый объект рисования в первом решении. Документация объясняет это, но я еще не понял это полностью. Так что первое решение не идеально.
Очевидно, что помимо слоев существуют и другие возможности рисования, что делает второе решение бесполезным. Я действительно хочу получить активный объект рисования, каким бы он ни был. Примечательно, что я хочу получить его, даже если это не слой.
Что касается третьего решения, я не уверен, потому что я не знаю, какие объекты рисования передаются в whiten_all в его пятом параметре при его вызове. Я не смог найти разумную документацию по этому поводу.
Мое непонимание того, как получить активный объект рисования, может быть причиной моей третьей (и худшей) проблемы (см. ниже).
Какова замена GIMP 3 для GIMP 2 gimp_image_get_active_drawable(), или если такой замены нет, как я могу получить активный объект рисования, желательно без циклического прохождения всех drawables и проверка того, какой из них «активен»?
3:

Это худшая из проблем; это может быть связано с проблемой 2. При запуске плагина whiten_all выполняется, но никак не изменяет изображения.
Я знаю, что он выполняется из следующего наблюдения: после раскомментирования строки #Gimp.message("Hello world!") появляется сообщение "Hello world!" появляется в строке состояния GIMP, когда я запускаю плагин.
Кроме того, в GIMP 2 плагину требовалось несколько секунд на каждое изображение (при обработке обычных изображений, созданных на более ранних этапах моего рабочего процесса), в течение этого времени показывался индикатор выполнения. Точно то же самое происходит в GIMP 3 (включая индикатор выполнения). Поэтому я убежден, что что-то действительно вычисляется, но по неизвестным причинам результат не применяется к соответствующим изображениям.
Возможно, это не работает, потому что я использую неправильный рисунок (см. проблему 2). Чтобы получить правильную прорисовку, я использовал все варианты, упомянутые в описании задачи 2., но безрезультатно. Независимо от того, как я получаю рисуемый объект, видимое изображение не меняется при запуске whiten_all.
Почему в открытых изображениях не отображаются изменения при запуске плагина?
Наконец, вот код:

Код: Выделить всё

#!/usr/bin/env python3

import sys
import gi
gi.require_version('Gimp', '3.0')
from gi.repository import Gimp
gi.require_version('GimpUi', '3.0')
from gi.repository import GimpUi
from gi.repository import GLib

class PP_WhitenAll (Gimp.PlugIn):

def do_query_procedures(self):
return [ "pp-treat-normal-scans" ]

def do_set_i18n (self, name):
return False

def do_create_procedure(self, name):
procedure = Gimp.ImageProcedure.new(self, name,
Gimp.PDBProcType.PLUGIN,
self.whiten_all, None)

procedure.set_image_types("*")

procedure.set_menu_label("Whiten Images (Normal Paper)")
procedure.add_menu_path('/Colors')

procedure.set_documentation("Whiten Images (Normal Paper)",
"Whiten Images (Normal Paper)",
name)
procedure.set_attribution("Test", "Test", "2026-01-03")

return procedure

def whiten_all(self, procedure, run_mode, image, drawables, config, run_data):
#Gimp.message("Hello world!")

images = Gimp.get_images()
for image in images:
image.undo_group_start()
drw=Gimp.Image.get_selected_drawables(image)[0]
Gimp.Drawable.curves_spline(drw,
0,
[0,0,108,108,192,192,220,227,224,255])
image.undo_group_end()

return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error())

Gimp.main(PP_WhitenAll.__gtype__, sys.argv)
Это минимальный рабочий пример, демонстрирующий основную проблему. Я знаю, что обычно следует избегать групп отмены, но в данном случае мне бы очень хотелось их иметь.

Подробнее здесь: https://stackoverflow.com/questions/798 ... fu-plug-in
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»