6

ネストされたレイヤー構造を持つ XCD ファイルがあります。

image
    front-layer
    content-layer
        content-layer-name-1
        content-layer-name-2
        content-layer-name-3
    back-layer

でファイルを開き、、 、 as 、およびをimage = pdb.gimp_file_load(xcf_file, xcf_file)取得できます。しかし、Gimp はリスト インデックスでサブレイヤーを取得できません。front-layercontent-layerback-layerimage.layers[0]image.layers[1]image.layers[2]content-layer

を使用できますpdb.gimp_image_get_layer_by_name(image, 'content-layer-name-3')が、レイヤーの名前がわかりません。

を試してみpdb.gimp_item_get_children(image.layers[1])ましたが、このメソッドはアイテムの子のリストを返しINT32ARRAY、ID でアイテムを取得する方法が見つかりませんでした。

Gimp (2.8) で Python を使用してグループ レイヤーからサブレイヤーを取得するにはどうすればよいですか?

4

2 に答える 2

9

GIMP Python は、この開発サイクルでほとんどメンテナンスされませんでした (その多くは私自身のせいです)。

行われた数少ない更新の 1 つは、"Item" クラスの作成と、PDB メソッドによって返された数値 ID を使用してアイテムを取得できるようにするクラス メソッドの実装です。

したがって、あなたが見つけたように、 を使用pdb.gimp_item_get_children(group_layer)して、返された子の ID を使用gimp.Item.from_idして実際のレイヤーを取得できます。

これは、「手動で」サブレイヤーを取得するGIMPコンソールセクションです。

>>> img = gimp.image_list()[0]
>>> c = img.layers[0]
>>> c
<gimp.Layer 'Layer Group'>
>>> pdb.gimp_item_get_children(c)
(1, (4,))
>>> c2 = gimp.Item.from_id(4)
>>> c2
<gimp.Layer 'cam2'>
>>> 

**更新**

私はハッキングに何時間も費やしましたが、GIMP 2.8 final にはレイヤー グループの適切なサポートが付属しています。gimp 2.8 RC 1 までは上記のハックが必要ですが、今すぐ git master からプロジェクトをビルドすると、レイヤー グループは次のインスタンスとして表示されます。 "GroupLayer" であり、画像の "layers" 属性と同じように機能する "layers" 属性を備えています。

コミット 75242a03e45ce751656384480e747ca30d728206

 Date:   Fri Apr 20 04:49:16 2012 -0300

     pygimp: adds proper support for layer groups

     Layer groups where barely supported using numeric IDs and
     by calling gimp.Item.from_id. This adds a Python
     GroupLayer class.
于 2012-04-20T03:36:13.620 に答える
1

故障していただきありがとうございます。プラグインを 2.6 から 2.7 ~ 2.8 に更新する過程で、同じ問題に苦しんでいました。編集された関数は次のとおりです。

def find_layer_by_name (image, name):
for layer in image.layers:
    #check if layer is a group and drill down if it is
    if pdb.gimp_item_is_group(layer):
        gr = layer
        gr_items = pdb.gimp_item_get_children(layer)
        for index in gr_items[1]:
            item = gimp.Item.from_id(index)
            if item.name == name:
                return item

    # if layer is on the first level     
    if layer.name == name:
        return layer
        return None
于 2012-04-25T10:51:13.933 に答える