2012-04-19 48 views
4

我有一個嵌套層結構的XCD文件:獲得從基層的子層與Python在GIMP

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

我打開與image = pdb.gimp_file_load(xcf_file, xcf_file)該文件,並可以得到front-layercontent-layerback-layerimage.layers[0]image.layers[1]image.layers[2] 。但Gimp無法通過列表索引獲取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從組圖層獲取子圖層?

回答

7

GIMP Python在這個開發週期中大部分時間都沒有維護(您可以將這些歸咎於我自己)。

完成的少量更新之一是創建「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最終會來對Layer Groups有適當的支持 - 你需要上面的hack以達到gimp 2.8 RC 1,但是如果你現在從git master創建項目,那麼圖層組將顯示爲「GroupLayer」的實例,並且具有「圖層」屬性就像圖像中的「圖層」屬性一樣工作。

commit 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. 
0

感謝您的故障,我用同樣的問題做鬥爭,我在更新我的插件,從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 
+0

你現在可以檢查「圖層」屬性,並從那裏檢索子圖層。請記住,可能有多於兩層的層次,就像包含其他組的層次一樣。 – jsbueno 2012-05-31 18:19:48