| Crates.io | image-renderer |
| lib.rs | image-renderer |
| version | 0.1.1 |
| created_at | 2025-12-30 08:00:33.502088+00 |
| updated_at | 2025-12-30 08:44:55.39199+00 |
| description | Image renderer |
| homepage | |
| repository | https://github.com/jerryshew/image-renderer |
| max_upload_size | |
| id | 2012244 |
| size | 503,604 |
一个功能完整的 Rust 图像处理库,参考 Skia API 风格设计,提供简洁易用的 2D 图形绘制能力。
🎨 丰富的绘图功能
🛤️ 路径系统(Path)
🔄 变换系统(Transform)
✂️ 裁剪系统(Clipping)
📝 文本渲染
🖼️ 图像处理
🎯 高性能
在 Cargo.toml 中添加依赖:
[dependencies]
image-renderer = "0.1.0"
use image_renderer::{Canvas, Color, Paint, Point, Rect, Font, TextStyle};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建 800x600 的画布,白色背景
let mut canvas = Canvas::new_with_color(800, 600, Color::WHITE)?;
// 绘制填充矩形
let rect = Rect::new(100, 100, 200, 150);
let paint = Paint::fill(Color::BLUE);
canvas.draw_rect(rect, &paint);
// 绘制描边圆形
let center = Point::new(400, 300);
let paint_stroke = Paint::stroke(Color::RED, 3.0);
canvas.draw_circle(center, 80.0, &paint_stroke);
// 绘制文本
let font = Font::default_system_font()?;
let text_style = TextStyle::new(font, 24.0);
let mut paint_text = Paint::new();
paint_text.set_color(Color::BLACK);
canvas.draw_text("Hello, World!", Point::new(100, 50), &text_style, &paint_text);
// 保存图片
canvas.save("output.png")?;
Ok(())
}
use image_renderer::{Canvas, Color, Paint, Point, DashStyle};
let mut canvas = Canvas::new_with_color(800, 600, Color::WHITE)?;
// 创建虚线画笔
let mut paint = Paint::stroke(Color::BLUE, 2.0);
paint.set_dash_style(DashStyle::ShortDash);
// 绘制虚线
canvas.draw_dashed_line(Point::new(50, 100), Point::new(750, 100), &paint);
canvas.save("dashed_line.png")?;
use image_renderer::{Canvas, Color, Rect, Surface};
// 加载源图片
let source_image = Surface::from_file("button.png")?;
// 创建画布
let mut canvas = Canvas::new_with_color(800, 600, Color::WHITE)?;
// 定义九宫格的中心区域(保留边缘 20 像素)
let center = Rect::new(20, 20, 60, 60);
// 绘制到目标区域(会自动拉伸)
let dst = Rect::new(50, 50, 300, 150);
canvas.draw_image_nine(&source_image, center, dst)?;
canvas.save("nine_patch_output.png")?;
use image_renderer::{Canvas, Color, Paint, Rect, Border, BorderSide, BorderRadius};
let mut canvas = Canvas::new_with_color(800, 600, Color::WHITE)?;
// 创建自定义边框
let border = Border {
top: BorderSide::new(Color::RED, 5.0),
right: BorderSide::new(Color::GREEN, 3.0),
bottom: BorderSide::new(Color::BLUE, 5.0),
left: BorderSide::new(Color::YELLOW, 3.0),
};
let radius = BorderRadius {
top_left: 20.0,
top_right: 10.0,
bottom_right: 20.0,
bottom_left: 10.0,
};
let rect = Rect::new(100, 100, 300, 200);
let paint = Paint::fill(Color::WHITE);
canvas.draw_rect_with_border(rect, &paint, &border, &radius);
canvas.save_to_file("custom_border.png")?;
use image_renderer::{Canvas, Color, Paint, Path, PathDirection};
let mut canvas = Canvas::new_with_color(800, 600, Color::WHITE)?;
// 创建路径
let mut path = Path::new();
path.move_to((100.0, 100.0));
path.line_to((200.0, 100.0));
path.quad_to((250.0, 150.0), (200.0, 200.0));
path.cubic_to((150.0, 250.0), (100.0, 250.0), (100.0, 200.0));
path.close();
// 绘制路径
let paint = Paint::fill(Color::BLUE);
canvas.draw_path(&path, &paint);
canvas.save_to_file("path_output.png")?;
use image_renderer::{Canvas, Color, Paint, Rect};
let mut canvas = Canvas::new_with_color(800, 600, Color::WHITE)?;
let rect = Rect::new(0, 0, 100, 100);
let paint = Paint::fill(Color::RED);
// 保存状态
canvas.save();
// 应用变换
canvas.translate(200.0, 200.0);
canvas.rotate(45.0);
canvas.scale(1.5, 1.5);
// 绘制
canvas.draw_rect(rect, &paint);
// 恢复状态
canvas.restore();
canvas.save_to_file("transform_output.png")?;
use image_renderer::{Canvas, ClipOp, Color, Paint, Point, Rect};
let mut canvas = Canvas::new_with_color(800, 600, Color::WHITE)?;
// 设置裁剪区域
let clip_rect = Rect::new(100, 100, 200, 200);
canvas.save();
canvas.clip_rect(clip_rect, ClipOp::Intersect);
// 绘制(只有裁剪区域内的部分会显示)
let paint = Paint::fill(Color::BLUE);
canvas.draw_circle(Point::new(200, 200), 150.0, &paint);
canvas.restore();
canvas.save_to_file("clip_output.png")?;
// 创建画布
let canvas = Canvas::new(800, 600)?;
let canvas = Canvas::new_with_color(800, 600, Color::WHITE)?;
// 清空画布
canvas.clear(Color::WHITE);
// 保存图片
canvas.save_to_file("output.png")?;
// 状态管理
canvas.save(); // 保存当前状态
canvas.restore(); // 恢复之前的状态
// 创建填充画笔
let paint = Paint::fill(Color::BLUE);
// 创建描边画笔
let paint = Paint::stroke(Color::RED, 3.0);
// 设置虚线样式
paint.set_dash_style(DashStyle::ShortDash);
// 预定义颜色
Color::RED
Color::GREEN
Color::BLUE
Color::WHITE
Color::BLACK
// RGB 创建
Color::rgb(255, 0, 0)
// RGBA 创建
Color::rgba(255, 0, 0, 128)
// 十六进制创建
Color::from_hex("#FF0000")?
Color::from_hex("#FF0000FF")?
// 绘制矩形
canvas.draw_rect(rect, &paint);
canvas.draw_rounded_rect(rect, radius, &paint);
// 绘制圆形和椭圆
canvas.draw_circle(center, radius, &paint);
canvas.draw_oval(rect, &paint);
// 绘制线条
canvas.draw_line(start, end, &paint);
canvas.draw_dashed_line(start, end, &paint);
// 绘制路径
canvas.draw_path(&path, &paint);
// 绘制文本
canvas.draw_text(text, position, &text_style, &paint);
// 绘制图片
canvas.draw_image(&surface, dst_rect)?;
canvas.draw_image_nine(&surface, center, dst_rect)?;
// 平移
canvas.translate(dx, dy);
// 缩放
canvas.scale(sx, sy);
// 旋转(角度)
canvas.rotate(degrees);
canvas.rotate_around(degrees, px, py);
// 重置变换
canvas.reset_matrix();
// 设置变换矩阵
canvas.set_matrix(&matrix);
canvas.concat(&matrix);
// 矩形裁剪
canvas.clip_rect(rect, ClipOp::Intersect);
// 路径裁剪
canvas.clip_path(&path, ClipOp::Intersect);
// 获取裁剪边界
let bounds = canvas.get_clip_bounds();
支持多种虚线样式:
DashStyle::Solid - 实线DashStyle::ShortDash - 短虚线DashStyle::LongDash - 长虚线DashStyle::Dot - 点状DashStyle::DashDot - 点划线DashStyle::DashDotDot - 双点划线DashStyle::Custom(Vec<f32>) - 自定义模式项目包含完整的示例程序,展示了所有主要功能:
# 运行主程序(包含所有基础示例)
cargo run
# 运行路径绘制示例
cargo run --example path_drawing
# 运行变换示例
cargo run --example transform
# 运行裁剪示例
cargo run --example clipping
# 运行测试
cargo test
# 构建 Release 版本
cargo build --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 学习裁剪技术本库参考 skia-safe API 设计,提供了以下核心功能:
| 功能 | skia-safe | image-renderer | 说明 |
|---|---|---|---|
| 基础图形 | ✅ | ✅ | 矩形、圆形、椭圆等 |
| 路径系统 | ✅ | ✅ | Path、贝塞尔曲线 |
| 变换矩阵 | ✅ | ✅ | 平移、缩放、旋转 |
| 裁剪系统 | ✅ | ✅ | 矩形和路径裁剪 |
| 状态管理 | ✅ | ✅ | save/restore |
| 文本渲染 | ✅ | ✅ | 字体、样式 |
| 图片处理 | ✅ | ✅ | 加载、保存、变换 |
| 虚线样式 | ✅ | ✅ | 多种虚线模式 |
| 渐变填充 | ✅ | 🚧 | 计划中 |
| 阴影效果 | ✅ | 🚧 | 计划中 |
查看完整的 API 文档:
cargo doc --open
欢迎提交 Issue 和 Pull Request!
本项目采用 MIT 许可证 - 详见 LICENSE 文件
Jerry jerry@jerry.moe