Взвешенная смесь в библиотеке GEGL

Может ли кто-нибудь опубликовать пример кода о том, как использовать операции «gegl: weighted-blend» в коде c, а не gegl (терминал) с файлами xml (фильтрами).
Я начал использовать библиотеку 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 является пустой экран.


person saeed hardan    schedule 05.10.2014    source источник


Ответы (1)


Сейчас есть несколько небольших проблем с вашим кодом.

  1. Вы неправильно подключаетесь к «aux» пэду операции взвешенного смешивания. Правильный способ подключения выхода 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);
person drawoc    schedule 21.10.2014
comment
Большое спасибо, сэр, но вы пропустили награду xD. - person saeed hardan; 22.10.2014