GIMP Python Plugin для загрузки 2 изображений в виде слоев - PullRequest
1 голос
/ 11 октября 2019

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

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

#!/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), чтобы открыть новое изображение. Это означает, что мне нужно затем подогнать Canvas к слоям и корректировать масштаб и положение каждый раз, когда я загружаю новую пару изображений.

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

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

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

Вопрос 2

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

Вопрос 3

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

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

1 Ответ

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

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

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

PS: Для color2alpha:

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 является прямой копией Схемы. В Python параметр RUN-INTERACTIVE не является позиционным, поэтому он не отображается в большинстве вызовов, если вам это нужно, это параметр ключевого слова.

...