Взвешенная смесь в библиотеке 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 - пустой экран.
1 ответ
Есть несколько небольших проблем с вашим кодом прямо сейчас.
- Вы неправильно подключаетесь к блоку "aux" операции взвешенного смешивания. Правильный способ подключения выхода c2g к входу взвешенного смешивания:
gegl_node_connect_to (c2g, "output", blend, "aux");
, Прямо сейчас вы пытаетесь установить его как свойство узла взвешенного смешивания, но входные площадки (изображения) и свойства - это разные понятия в gegl. - Взвешенный узел не имеет
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);