Image Renderer
一个功能完整的 Rust 图像处理库,参考 Skia API 风格设计,提供简洁易用的 2D 图形绘制能力。
✨ 主要特性
-
🎨 丰富的绘图功能
- 基本图形:矩形、圆形、椭圆、线条
- 圆角矩形、自定义边框
- 虚线样式支持(短虚线、长虚线、点状、点划线等)
-
🛤️ 路径系统(Path)
- 支持复杂矢量图形绘制
- 贝塞尔曲线(二次、三次)
- 圆弧、直线、闭合路径
- 路径填充规则(Winding、EvenOdd)
-
🔄 变换系统(Transform)
- 2D 仿射变换矩阵
- 平移、缩放、旋转
- 变换组合和状态管理
- save/restore 状态栈
-
✂️ 裁剪系统(Clipping)
- 矩形裁剪
- 路径裁剪
- 裁剪操作(交集、差集)
- 多层裁剪支持
-
📝 文本渲染
- 支持系统字体和自定义字体
- 可调节字体大小、颜色
- 支持加粗、斜体样式
-
🖼️ 图像处理
- 图片加载与保存(PNG、JPEG)
- 九宫格(Nine-Patch)图片绘制
- 图像变换和渲染
-
🎯 高性能
- Release 模式下启用 LTO 优化
- 零成本抽象设计
- 高效的内存管理
📦 安装
在 Cargo.toml 中添加依赖:
[]
= "0.1.0"
🚀 快速开始
基础绘制示例
use ;
虚线绘制
use ;
let mut canvas = new_with_color?;
// 创建虚线画笔
let mut paint = stroke;
paint.set_dash_style;
// 绘制虚线
canvas.draw_dashed_line;
canvas.save?;
九宫格图片绘制
use ;
// 加载源图片
let source_image = from_file?;
// 创建画布
let mut canvas = new_with_color?;
// 定义九宫格的中心区域(保留边缘 20 像素)
let center = new;
// 绘制到目标区域(会自动拉伸)
let dst = new;
canvas.draw_image_nine?;
canvas.save?;
自定义边框
use ;
let mut canvas = new_with_color?;
// 创建自定义边框
let border = Border ;
let radius = BorderRadius ;
let rect = new;
let paint = fill;
canvas.draw_rect_with_border;
canvas.save_to_file?;
路径绘制
use ;
let mut canvas = new_with_color?;
// 创建路径
let mut path = new;
path.move_to;
path.line_to;
path.quad_to;
path.cubic_to;
path.close;
// 绘制路径
let paint = fill;
canvas.draw_path;
canvas.save_to_file?;
变换操作
use ;
let mut canvas = new_with_color?;
let rect = new;
let paint = fill;
// 保存状态
canvas.save;
// 应用变换
canvas.translate;
canvas.rotate;
canvas.scale;
// 绘制
canvas.draw_rect;
// 恢复状态
canvas.restore;
canvas.save_to_file?;
裁剪操作
use ;
let mut canvas = new_with_color?;
// 设置裁剪区域
let clip_rect = new;
canvas.save;
canvas.clip_rect;
// 绘制(只有裁剪区域内的部分会显示)
let paint = fill;
canvas.draw_circle;
canvas.restore;
canvas.save_to_file?;
📚 核心 API
Canvas(画布)
// 创建画布
let canvas = new?;
let canvas = new_with_color?;
// 清空画布
canvas.clear;
// 保存图片
canvas.save_to_file?;
// 状态管理
canvas.save; // 保存当前状态
canvas.restore; // 恢复之前的状态
Paint(画笔)
// 创建填充画笔
let paint = fill;
// 创建描边画笔
let paint = stroke;
// 设置虚线样式
paint.set_dash_style;
Color(颜色)
// 预定义颜色
RED
GREEN
BLUE
WHITE
BLACK
// RGB 创建
rgb
// RGBA 创建
rgba
// 十六进制创建
from_hex?
from_hex?
绘图方法
// 绘制矩形
canvas.draw_rect;
canvas.draw_rounded_rect;
// 绘制圆形和椭圆
canvas.draw_circle;
canvas.draw_oval;
// 绘制线条
canvas.draw_line;
canvas.draw_dashed_line;
// 绘制路径
canvas.draw_path;
// 绘制文本
canvas.draw_text;
// 绘制图片
canvas.draw_image?;
canvas.draw_image_nine?;
变换方法
// 平移
canvas.translate;
// 缩放
canvas.scale;
// 旋转(角度)
canvas.rotate;
canvas.rotate_around;
// 重置变换
canvas.reset_matrix;
// 设置变换矩阵
canvas.set_matrix;
canvas.concat;
裁剪方法
// 矩形裁剪
canvas.clip_rect;
// 路径裁剪
canvas.clip_path;
// 获取裁剪边界
let bounds = canvas.get_clip_bounds;
🎨 虚线样式
支持多种虚线样式:
DashStyle::Solid- 实线DashStyle::ShortDash- 短虚线DashStyle::LongDash- 长虚线DashStyle::Dot- 点状DashStyle::DashDot- 点划线DashStyle::DashDotDot- 双点划线DashStyle::Custom(Vec<f32>)- 自定义模式
🔧 运行示例
项目包含完整的示例程序,展示了所有主要功能:
# 运行主程序(包含所有基础示例)
# 运行路径绘制示例
# 运行变换示例
# 运行裁剪示例
# 运行测试
# 构建 Release 版本
运行后会生成以下示例图片:
output_basic.png- 基础绘制示例output_nine_patch.png- 九宫格绘制示例output_dashed_lines.png- 虚线样式示例output_custom_borders.png- 自定义边框示例output_path_drawing.png- 路径绘制示例output_transform.png- 变换操作示例output_clipping.png- 裁剪操作示例
🎓 学习资源
示例代码
- 基础绘制: 查看
src/main.rs了解基本绘图功能 - 路径绘制: 查看
examples/path_drawing.rs学习如何绘制复杂矢量图形 - 变换操作: 查看
examples/transform.rs学习 2D 变换 - 裁剪功能: 查看
examples/clipping.rs学习裁剪技术
API 特性对比
本库参考 skia-safe API 设计,提供了以下核心功能:
| 功能 | skia-safe | image-renderer | 说明 |
|---|---|---|---|
| 基础图形 | ✅ | ✅ | 矩形、圆形、椭圆等 |
| 路径系统 | ✅ | ✅ | Path、贝塞尔曲线 |
| 变换矩阵 | ✅ | ✅ | 平移、缩放、旋转 |
| 裁剪系统 | ✅ | ✅ | 矩形和路径裁剪 |
| 状态管理 | ✅ | ✅ | save/restore |
| 文本渲染 | ✅ | ✅ | 字体、样式 |
| 图片处理 | ✅ | ✅ | 加载、保存、变换 |
| 虚线样式 | ✅ | ✅ | 多种虚线模式 |
| 渐变填充 | ✅ | 🚧 | 计划中 |
| 阴影效果 | ✅ | 🚧 | 计划中 |
📖 文档
查看完整的 API 文档:
🛠️ 技术栈
- 图像处理: image - 图片编解码
- 图像操作: imageproc - 图像处理算法
- 字体渲染: rusttype + font-kit
- 错误处理: thiserror + anyhow
- 日志: tracing
🤝 贡献
欢迎提交 Issue 和 Pull Request!
📄 许可证
本项目采用 MIT 许可证 - 详见 LICENSE 文件
👤 作者
Jerry jerry@jerry.moe