2014-10-05 57 views
2

有人可以發表一個代碼示例,瞭解如何在c代碼中使用「gegl:weighted-blend」操作,而不是使用xml文件(過濾器)對gegl(terminal)進行操作。
我開始使用gegl庫,它完全符合我的需求,但我似乎無法找到一個好的文檔(該網站很好,但不詳細)。 有沒有一個論壇或地方可以向gegl圖書館尋求幫助?
如果它幫助這裏是我使用GEGL的審判:加權混合:GEGL庫中的加權混合

GeglNode *gegl = gegl_node_new(); 

GeglNode *display  = gegl_node_create_child (gegl, "gegl:display"); 
GeglNode *over  = gegl_node_new_child (gegl,"operation", "gegl:over",NULL); 
GeglNode *c2g   = gegl_node_new_child (gegl,"operation", "gegl:c2g",NULL); 
GeglNode *blur  = gegl_node_new_child (gegl,"operation", "gegl:gaussian-blur","std- dev-x",1.0,"std-dev-y",1.0,NULL); 


GeglNode *img   = gegl_node_new_child (gegl,"operation", "gegl:load","path","test.jpg",NULL); 
GeglBuffer *buffer = NULL; 
GeglNode *sink  = gegl_node_new_child (gegl,"operation", "gegl:buffer-sink","buffer", &buffer,NULL); 
gegl_node_link_many (img , c2g , sink, NULL); 
gegl_node_process (sink); 
GeglNode *blend  = gegl_node_new_child (gegl,"operation", "gegl:weighted-blend","aux",buffer,"value",0.0,NULL); 

gegl_node_link_many(img, blend, display, NULL); 
//gegl_node_process (blend); 
//gegl_node_link_many(blend, display, NULL); 
gegl_node_process (display); 

有點信息,在這個例子中,我有一個test.jpg放在圖像。我在其上應用了一個c2g過濾器,然後我嘗試將它與自身混合,而不使用c2g過濾器。
c2g和gegl:buffer-sink部分工作,這意味着我可以用灰度顯示圖像,並且緩衝區以灰度顏色填充圖像。
我在做什麼錯?因爲這與gegl:weighted-blend的組合輸出是空白屏幕。

回答

0

您的代碼現在有幾個小問題。

  1. 您正在錯誤地連接到加權混合操作的「輔助」鍵盤。將c2g輸出連接到加權混合輸入的正確方法是gegl_node_connect_to (c2g, "output", blend, "aux");。現在你試圖將它設置爲加權混合節點的屬性,但輸入板(圖像)和屬性在gegl中是不同的概念。
  2. 加權混合節點沒有value屬性,在這種情況下使用它可能會非常棘手,如果您需要調整混合量。構建圖形的更好方法是應用gegl:opacity來設置頂部圖像的透明度,然後使用svg:src-over將它們混合在一起(這大致就是gimp中的圖層堆棧所做的)。

因此,固定你的例子可能是這樣的:

GeglNode *gegl = gegl_node_new(); 

GeglNode *img  = gegl_node_new_child (gegl, 
             "operation", "gegl:load", 
             "path", "test.jpg", 
             NULL); 

GeglNode *save = gegl_node_new_child (gegl, 
             "operation", "gegl:save", 
             "path","result.jpg", 
             NULL); 

GeglNode *over = gegl_node_new_child (gegl, 
             "operation", "gegl:over", 
             NULL); 

GeglNode *c2g  = gegl_node_new_child (gegl, 
             "operation", "gegl:c2g", 
             NULL); 

GeglNode *opacity = gegl_node_new_child (gegl, 
             "operation", "gegl:opacity", 
             "value", 0.4, NULL); 

GeglNode *blend = gegl_node_new_child (gegl, 
             "operation", "svg:src-over", 
             NULL); 

gegl_node_link_many (img, c2g, opacity, NULL); 
gegl_node_connect_to (opacity, "output", blend, "aux"); 
gegl_node_link_many (img, blend, save, NULL); 

gegl_node_process (save); 
+0

感謝ü非常先生,但u've錯過了賞金的xD。 – 2014-10-22 16:59:14