Плагин GIMP Python для загрузки 2 изображений в виде слоев

Я пытаюсь сделать плагин для gimp, который открывает два изображения как отдельные слои и трансформирует одно из них (подробнее об этом ниже). Я использую GIMP 2.10.12.

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

#!/usr/bin/env python2
import os

from gimpfu import *

def load_pair(img_f):
    mask_f = img_f.replace(IMG_DIR, PRED_DIR)
    result_f = os.path.splitext(img_f.replace(IMG_DIR, SAVE_DIR))[0]
    result_dir = os.path.dirname(result_f)
    if not os.path.isdir(result_dir):
        os.makedirs(result_dir)

    img = gimp.Image(100, 100)
    pdb.gimp_display_new(img)
    for f, name, pos in ((img_f, "Image", 0), (mask_f, "Mask", 1)):
        layer = pdb.gimp_file_load_layer(img, f)
        pdb.gimp_layer_set_name(layer, name)
        pdb.gimp_image_insert_layer(img, layer, None, pos)


register(
    "python_fu_open_image_pair",
    ...,
    "<Toolbox>/Image/Open Image Pair",
    "",
    [(PF_FILE, "img_f", "Image:", None)],
    [],
    load_pair
)

main()

Этот вид делает то, что я хочу, но с парой проблем.

Вопрос 1

В настоящее время я использую gimp.Image(100, 100) для открытия нового изображения. Это означает, что я должен затем подогнать холст к слоям и настроить масштаб и положение каждый раз, когда я загружаю новую пару изображений.

Есть ли способ узнать размер изображения из pdb перед его открытием или мне нужно использовать для этого другую библиотеку (например, PIL)? Я пытаюсь свести зависимости моего плагина к минимуму.

Два изображения гарантированно имеют одинаковый размер.

Поскольку File->Open автоматически настраивает холст в соответствии с размером изображения, я надеюсь, что это будет хороший способ добиться этого.

вопрос 2

Я хотел бы автоматически создать и установить для текущего рабочего файла значение result_f + '.xcf' (см. код выше) - так, чтобы Файл -> Сохранить автоматически сохранялся в этот файл. Возможно ли это в pdb?

Вопрос 3

Самое главное, в настоящее время у меня есть изображения маски, сохраненные как черно-белые изображения. При загрузке маски в качестве нового слоя я хотел бы преобразовать черный цвет в прозрачный, а белый цвет в зеленый (0,255,0). Кроме того, поскольку они сохраняются в виде изображений .jpg, яркость белого и черного не обязательно точно соответствует 255 и 0, но может немного отличаться.

Как мне сделать это автоматически в моем плагине?


person Mate de Vita    schedule 11.10.2019    source источник


Ответы (1)


  1. Хорошим способом было бы нормально загрузить первое изображение, а остальные как дополнительные слои. В противном случае вы можете сбросить размер холста (pdb.gimp_image_resize(...)) после загрузки всех слоев, а затем создать отображение.

  2. Вы можете дать имя и файл по умолчанию для изображения, установив image.name и image.filename.

  3. Чтобы преобразовать белый в зеленый, используйте pdb.plug_in_colors_channel_mixer(...) и установите все усиления на 0., кроме зеленого в зеленом. Сделайте черный прозрачным, используя pdb.plug_in_colortoalpha(...).

PS: для цвета2альфа:

import gimpcolor

color=gimpcolor.RGB(0,255,0) # green, integer args: 0->255)
# or
color=gimpcolor.RGB(0.,1.,0) # green, floating point args (0.->1.)

pdb.plug_in_colortoalpha(image, layer, color)

Документ Python является прямой копией документа Scheme. В Python параметр RUN-INTERACTIVE не является позиционным, поэтому он не появляется в большинстве вызовов, если он вам нужен, это параметр ключевого слова.

person xenoid    schedule 11.10.2019
comment
Я сделал 1) и 2) работу, но я застрял на пункте 3. Я не могу найти, как использовать эти две функции на моем слое. Я не могу найти ни одну из этих функций на странице developer.gimp.org/api/2.0, и я пытались подписаться на oldhome.schmorp.de/marc/pdb/plug_in_colortoalpha.html с pdb.plug_in_colortoalpha(RUN_NONINTERACTIVE, img, layer, '#000') и pdb.plug_in_colortoalpha(RUN_NONINTERACTIVE, img, layer, (0, 0, 0)), но я получаю ошибку Wrong number of arguments. Я также пытался удалить аргумент img, но получил ошибку Wrong parameter type. - person Mate de Vita; 14.10.2019