【问题标题】:Use generated image as pattern inside cairo graphics使用生成的图像作为 cairo 图形中的图案
【发布时间】:2020-01-27 09:49:19
【问题描述】:

我已经使用模式浏览了 cairo 图形示例。

pattern = cairo_pattern_create_for_surface (image);
cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);

现在,我有一个带有以下序列的表面,而不是“图像”:-

cairo_move_to(cr, xc[0], yc[0]);
    for (int i = 0; i < xc.size(); i++)
        cairo_line_to(cr, xc[i], yc[i]);

如何使用这个生成的 cairo 表面并将其用作模式的输入? 如果我简单地使用它是行不通的 pattern = cairo_pattern_create_for_surface (surface); 其中表面有 cairo_t cr。

【问题讨论】:

    标签: graphics2d cairo


    【解决方案1】:

    如果我只使用 pattern = cairo_pattern_create_for_surface (surface); 它不起作用其中表面有 cairo_t cr。

    是的,确实如此。

    下面的代码在一个 10x10 的表面上画一个十字,然后用它填充一个 20x20 的表面。

    #include <cairo.h>
    
    int main()
    {
        cairo_surface_t *pattern_surface = cairo_image_surface_create(
                CAIRO_FORMAT_ARGB32, 10, 10);
        cairo_surface_t *result_surface = cairo_image_surface_create(
                CAIRO_FORMAT_ARGB32, 20, 20);
        cairo_t *cr;
        cairo_pattern_t *pattern;
    
        cr = cairo_create(pattern_surface);
        cairo_move_to(cr, 0, 0);
        cairo_line_to(cr, 10, 10);
        cairo_move_to(cr, 10, 0);
        cairo_line_to(cr, 0, 10);
        cairo_stroke(cr);
        cairo_destroy(cr);
    
        pattern = cairo_pattern_create_for_surface(pattern_surface);
        cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);
    
        cr = cairo_create(result_surface);
        cairo_set_source(cr, pattern);
        cairo_paint(cr);
        cairo_destroy(cr);
    
        cairo_surface_write_to_png(result_surface, "out.png");
    
        cairo_surface_destroy(pattern_surface);
        cairo_surface_destroy(result_surface);
        cairo_pattern_destroy(pattern);
        return 0;
    }
    

    【讨论】:

    • 知道了。我的问题是两个表面的大小相同。if (sg_surface2) cr = cairo_create(sg_surface2); cairo_scale(cr, 0.5, 0.5); cairo_set_source(cr, sg_pattern); cairo_paint(cr);
    • Pattern_surface 必须小于 result_surface。那是我的错误。
    猜你喜欢
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多