cario库

编译

用法

名词

path(路径)   stroke(描边)   fill(填充)   mask(蒙板)

接口

# 创建和销毁surface
cairo_image_surface_create                   // 内部内存创建图片surface
cairo_image_surface_create_for_data  // 外部内存创建图片surface
cairo_surface_destroy                             // 销毁surface

# 创建和销毁cario上下文
cairo_createcairo_destroy

# 设置绘制参数
cairo_set_operator         // 设置混合模式,默认CAIRO_OPERATOR_OVER
cairo_set_antialias          // 设置绘制抗锯齿效果,CAIRO_ANTIALIAS_BEST
cairo_set_source_rgb    // 设置绘制颜色(0.0到1.0范围)
cairo_set_source_rgba  // 设置绘制颜色,包含不透明度

# 设置绘制线条参数
cairo_set_line_cap         // 设置绘制线条两端处理,xxx_CAP_ROUND表示圆滑
cairo_set_line_join         // 设置绘制线条衔接处理,xxx_JOIN_ROUND表示圆滑
cairo_set_dash               // 设置绘制线条虚线模型

# 绘制函数
cairo_move_to               // 设置绘制线条起点(或贝塞尔曲线的起点)
cairo_rel_move_to        // 功能同上,采用的相对坐标,相对上一个参考点
cairo_line_to                  // 设置绘制直线终点
cairo_curve_to              // 设置绘制三次贝塞尔曲线(前两个参数是控制点最后是终点)
cairo_rectangle             // 构建矩形路径
cairo_arc​​​​​​​​​​​​​​​​​​​​​                        // 构建圆弧路径

# 渲染函数
cairo_stroke_preserve // 渲染cario上下文中的路径,没有清理path
cairo_stroke                  // 渲染cario上下文中的路径,同时清理path
cairo_fill                         // 填充path(非闭合path适用,前提path存在)
cairo_paint​​​​​​                    // source里的pattern或其他渲染出来
cairo_mask                    // source和mask混合渲染出来

# 工具函数
cairo_format_stride_for_width   // 获取图像格式的stride
cairo_stroke_extents                   // 获取路径最佳闭合矩形
cairo_in_stroke                             // 判断点是否在路径内部

# 输出相关
cairo_surface_write_to_png       // 将surface输出为png图片

原理

多点构造路径path,路径描边stroke,路径填充fill;(绘制和渲染分离)

实例

// 直接原图上操作
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
// dash
double dashed[] = {1.0, 2.0, 4.0, 8.0};
int len  = sizeof(dashed) / sizeof(dashed[0]);
cairo_set_dash(cr, dashed, len, 0);
cairo_set_dash(cr, NULL, 0, 0);
// 产生临时surface
#define M_PI 3.1415926
cairo_push_group(cr);
cairo_set_source_rgba (cr, 0.8, 0.8, 0.8, 0.6);
cairo_arc(cr, 100, 300, 80, 0.1 * M_PI, 1 * M_PI);
cairo_fill(cr);
cairo_pattern_t* pattern = cairo_pop_group(cr);
或cairo_pop_group_to_source(cr);
cairo_set_source(cr, pattern);
cairo_paint (cr);

参考

文档:https://www.cairographics.org/manual/index.html

是的,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、付费专栏及课程。

余额充值