GIMP Python 加载 2 个图像作为图层的插件

GIMP Python Plugin to load 2 images as layers

我正在尝试为 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) 打开新图片。这意味着每次加载新图像对时,我都必须将 Canvas 适合图层并调整缩放和位置。

有没有办法在打开图像之前从 pdb 中找到图像的大小,或者我是否必须为此使用另一个库(如 PIL)?我试图将我的插件的依赖性保持在最低限度。

两张图片保证大小一致。

由于“文件”->“打开”会自动将 canvas 调整为图像大小,我希望有一个很好的方法来实现这一点。

问题 2

我想自动创建当前工作文件并将其设置为 result_f + '.xcf'(参见上面的代码)- 这样文件 -> 保存将自动保存到该文件。这在 pdb 中可能吗?

问题 3

最重要的是,我目前将蒙版图像保存为黑白图像。将蒙版加载为新图层后,我想将黑色转换为透明,将白色转换为绿色 (0,255,0)。此外,由于它们被保存为 .jpg 图像,因此白色和黑色不一定完全是 255 和 0 强度,但可以稍微偏离。

如何在我的插件中自动执行此操作?

  1. 好的方法是正常加载第一张图像,其余的作为附加层。否则,您可以在加载所有图层后重置 canvas 大小 (pdb.gimp_image_resize(...)),然后创建显示。

  2. 您可以通过设置image.nameimage.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参数不是位置参数,所以它不会出现在大多数调用中,如果你需要它,它是一个关键字参数。