2

有人可以发布一个关于如何在 c 代码中使用“gegl:weighted-blend”操作的代码示例,而不是带有 xml 文件(过滤器)的 gegl(终端)。
我开始使用 gegl 库,它完全符合我的需求,但我似乎找不到好的文档(该网站很好但不详细)。是否有论坛或地方可以在使用 gegl 库进行编程时寻求帮助?
如果它有帮助,这是我使用 gegl:weighted-blend 的试验:

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 组合的输出是一个空白屏幕。

4

1 回答 1

1

您的代码现在存在一些小问题。

  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);
于 2014-10-21T22:45:37.627 回答