5.Cario图形库-图形和填充

在本节Cairo图形库指南中,我们会创建一些基本的和高级的图形,然后用颜色,模式,渐变色填充它们。

基本图形:
Cario图形库有一些API用于创建基本图形

这个例子中,我们创建了一个矩形,一个正方形,一个圆,一个弧形和一个椭圆形。

 

函数cairo_rectangle用来创建矩形和正方形。一个正方形只是一个特殊的矩形。

 

这一行创建了一个圆。

 

这个函数创建了一个椭圆。

 

其它图形可以用上面的基本图形的组合来表示。

这个例子中,我们创建了一个星星,一个三角形,一个修改过的三角形。这些图形是用线条和弧线组成的。

 

星星是用保存在数组里面的点连接到一起形成的线画出来的。这个星星用cairo_close_path()把路径封闭,把最后一个和最开始的点连接到一起。

 

这个修改过的三角形是由两个线段和一个弧形组成的。

 

填充
一个颜色值由RGB三个分量组合而成。Cairo中,RGB取值范围为0-1.

这个例子中,我们画了四个填充过的矩形。

 

调用cairo_set_source_rgb()函数设置一个不透明的颜色值。参数为红,绿,蓝三个颜色分量。通过调用cairo_fill(),把设置这个颜色值填充到矩形里面。

 

模式

在这个例子中,我们又画了四个矩形,这一次,我们用了一些填充模式。我们用了四个从imp里面的图片。我们必须保持这些图片原来的尺寸,因为我们要把它们镶嵌进来。

我们在on_expose_event这个函数外面创建加载。当每次窗口需要重绘时,就不会再次加载了。


我们通过调用cairo_pattern_create_for_surface(),创建了一个模式。

 

这里,我们画了第一个矩形。cairo_set_source()函数告诉Cairo context用一个绘图模式进行绘图。这个图片大小并没有严格的适合这个矩形。我们设置CAIRO_EXTEND_REPEAT这个值,让这个模式循环镶嵌进来。cairo_rectangle()创建了一个矩形路径。最后,cairo_fill()用指定的模式填充这个路径。

 

原文链接:http://zetcode.com/tutorials/cairographicstutorial/shapesfills/

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,Cairo库可以显示JPEG图像。要在Cairo中加载和显示JPEG图像,需要使用libjpeg库。以下是一个使用Cairo和libjpeg的示例代码,可以读取JPEG图像并将其绘制到Cairo的绘图上下文中: ```c #include <cairo.h> #include <jpeglib.h> void draw_jpeg(cairo_t *cr, const char *filename) { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; JSAMPROW row_pointer[1]; FILE *infile = fopen(filename, "rb"); if (!infile) { fprintf(stderr, "Error opening JPEG file %s\n", filename); return; } cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); jpeg_stdio_src(&cinfo, infile); jpeg_read_header(&cinfo, TRUE); jpeg_start_decompress(&cinfo); int row_stride = cinfo.output_width * cinfo.output_components; unsigned char *buffer = (unsigned char *)malloc(row_stride); while (cinfo.output_scanline < cinfo.output_height) { row_pointer[0] = buffer; jpeg_read_scanlines(&cinfo, row_pointer, 1); for (int i = 0; i < row_stride; i += cinfo.output_components) { unsigned char r = buffer[i]; unsigned char g = buffer[i + 1]; unsigned char b = buffer[i + 2]; cairo_set_source_rgb(cr, r / 255.0, g / 255.0, b / 255.0); cairo_rectangle(cr, i / cinfo.output_components, cinfo.output_scanline - 1, 1, 1); cairo_fill(cr); } } free(buffer); jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); fclose(infile); } int main(int argc, char **argv) { cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 640, 480); cairo_t *cr = cairo_create(surface); draw_jpeg(cr, "example.jpg"); cairo_surface_write_to_png(surface, "output.png"); cairo_destroy(cr); cairo_surface_destroy(surface); return 0; } ``` 这个示例代码使用libjpeg库读取JPEG图像,然后将像素值转换为Cairo的RGB颜色,最后将每个像素绘制到Cairo的绘图上下文中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值