美文网首页C/CPLUS
C语言使用Cairo绘制光学三原色

C语言使用Cairo绘制光学三原色

作者: 一路向后 | 来源:发表于2022-03-17 21:09 被阅读0次

    1.源码实现

    #include <stdio.h>
    #include <cairo/cairo.h>
    
    #define CR_NUM 15
    #define M_PI 3.141592654
    
    int main()
    {
        cairo_surface_t *surface[CR_NUM];
        cairo_t *cr[CR_NUM];
        int i;
    
        for(i=0; i<CR_NUM; i++)
        {
            surface[i] = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 300, 300);
            cr[i] = cairo_create(surface[i]);
        }
    
        cairo_set_source_rgb(cr[1], 1, 0, 0);
        cairo_arc(cr[1], 100, 190, 80, 0, 2 * M_PI);
        cairo_fill(cr[1]);
    
        cairo_set_source_rgb(cr[2], 0, 1, 0);
        cairo_arc(cr[2], 200, 190, 80, 0, 2 * M_PI);
        cairo_fill(cr[2]);
    
        cairo_set_source_rgb(cr[3], 0, 0, 1);
        cairo_arc(cr[3], 150, 110, 80, 0, 2 * M_PI);
        cairo_fill(cr[3]);
    
        cairo_set_source_rgb(cr[4], 1, 1, 0);
        cairo_arc(cr[4], 100, 190, 80, 0, 2 * M_PI);
        cairo_fill(cr[4]);
    
        cairo_set_source_rgb(cr[5], 0, 1, 1);
        cairo_arc(cr[5], 200, 190, 80, 0, 2 * M_PI);
        cairo_fill(cr[5]);
    
        cairo_set_source_rgb(cr[6], 1, 0, 1);
        cairo_arc(cr[6], 150, 110, 80, 0, 2 * M_PI);
        cairo_fill(cr[6]);
    
        cairo_set_source_rgb(cr[7], 1, 1, 1);
        cairo_arc(cr[7], 150, 110, 80, 0, 2 * M_PI);
        cairo_fill(cr[7]);
    
        cairo_set_source_surface(cr[8], surface[7], 0, 0);
        cairo_paint(cr[8]);
        cairo_set_source_surface(cr[9], surface[1], 0, 0);
        cairo_paint(cr[9]);
        cairo_set_source_surface(cr[10], surface[2], 0, 0);
        cairo_paint(cr[10]);
        cairo_set_source_surface(cr[11], surface[3], 0, 0);
        cairo_paint(cr[11]);
        cairo_set_source_surface(cr[12], surface[4], 0, 0);
        cairo_paint(cr[12]);
        cairo_set_source_surface(cr[13], surface[5], 0, 0);
        cairo_paint(cr[13]);
        cairo_set_source_surface(cr[14], surface[6], 0, 0);
        cairo_paint(cr[14]);
    
        cairo_set_operator(cr[0], CAIRO_OPERATOR_ADD);
        cairo_set_operator(cr[8], CAIRO_OPERATOR_DEST_IN);
        cairo_set_operator(cr[9], CAIRO_OPERATOR_DEST_OUT);
        cairo_set_operator(cr[10], CAIRO_OPERATOR_DEST_OUT);
        cairo_set_operator(cr[11], CAIRO_OPERATOR_DEST_OUT);
        cairo_set_operator(cr[12], CAIRO_OPERATOR_DEST_IN);
        cairo_set_operator(cr[13], CAIRO_OPERATOR_DEST_IN);
        cairo_set_operator(cr[14], CAIRO_OPERATOR_DEST_IN);
    
        cairo_set_source_surface(cr[8], surface[4], 0, 0);
        cairo_paint(cr[8]);
        cairo_set_source_surface(cr[8], surface[5], 0, 0);
        cairo_paint(cr[8]);
        cairo_set_source_surface(cr[9], surface[2], 0, 0);
        cairo_paint(cr[9]);
        cairo_set_source_surface(cr[9], surface[3], 0, 0);
        cairo_paint(cr[9]);
        cairo_set_source_surface(cr[10], surface[1], 0, 0);
        cairo_paint(cr[10]);
        cairo_set_source_surface(cr[10], surface[3], 0, 0);
        cairo_paint(cr[10]);
        cairo_set_source_surface(cr[11], surface[1], 0, 0);
        cairo_paint(cr[11]);
        cairo_set_source_surface(cr[11], surface[2], 0, 0);
        cairo_paint(cr[11]);
        cairo_set_source_surface(cr[12], surface[2], 0, 0);
        cairo_paint(cr[12]);
        cairo_set_source_surface(cr[13], surface[3], 0, 0);
        cairo_paint(cr[13]);
        cairo_set_source_surface(cr[14], surface[1], 0, 0);
        cairo_paint(cr[14]);
    
        cairo_set_source_surface(cr[0], surface[8], 0, 0);
        cairo_paint(cr[0]);
        cairo_set_source_surface(cr[0], surface[9], 0, 0);
        cairo_paint(cr[0]);
        cairo_set_source_surface(cr[0], surface[10], 0, 0);
        cairo_paint(cr[0]);
        cairo_set_source_surface(cr[0], surface[11], 0, 0);
        cairo_paint(cr[0]);
        cairo_set_source_surface(cr[0], surface[12], 0, 0);
        cairo_paint(cr[0]);
        cairo_set_source_surface(cr[0], surface[13], 0, 0);
        cairo_paint(cr[0]);
        cairo_set_source_surface(cr[0], surface[14], 0, 0);
        cairo_paint(cr[0]);
    
        cairo_surface_write_to_png(surface[0], "a.png");
    
        for(i=0; i<CR_NUM; i++)
        {
            cairo_surface_destroy(surface[i]);
            cairo_destroy(cr[i]);
        }
    
        return 0;
    }
    

    2.编译源码

    $ gcc -o test test.c -lcairo
    

    3.运行程序

    $ ./test
    

    4.结果展示

    a.png

    相关文章

      网友评论

        本文标题:C语言使用Cairo绘制光学三原色

        本文链接:https://www.haomeiwen.com/subject/thdbdrtx.html