In this article, we will explore Resvg, a pure Rust SVG rendering library, and learn how to use it effectively within a Rust project. Scalable Vector Graphics (SVG) is a widely-used XML-based vector image format for creating two-dimensional graphics with support for interactivity and animation.
Resvg is a high-quality library that aims to provide an efficient and accurate rendering of SVG files. It is a perfect choice for developers who wish to incorporate SVG support in their Rust projects.
To follow along with this tutorial, you will need:
To start using Resvg in your Rust project, you need to add it as a dependency in your Cargo.toml
file:
[dependencies]
resvg = "0.19.0"
Now, let’s import the necessary modules in our main.rs
file:
use resvg::{prelude::*, usvg};
To load an SVG file, we use the usvg::Tree::from_file
function. It takes a file path as an argument and returns a Result<usvg::Tree, usvg::Error>
. Below is an example of how to load an SVG file:
fn load_svg(file_path: &str) -> Result<usvg::Tree, usvg::Error> {
let tree = usvg::Tree::from_file(file_path, &usvg::Options::default())?;
Ok(tree)
}
Once we have loaded an SVG file, we can render it using the resvg::render
function. This function takes a reference to the usvg::Tree
and a resvg::Options
object as arguments, and returns a Result<resvg::Image, resvg::Error>
. The following example demonstrates how to render an SVG image:
use resvg::Image;
fn render_svg(tree: &usvg::Tree, options: &resvg::Options) -> Result<Image, resvg::Error> {
let image = resvg::render(&tree, usvg::FitTo::Original, options)?;
Ok(image)
}
After rendering the SVG image, we can save it as a PNG file using the resvg::Image::save_png
method. This method takes a reference to a file path as its argument and returns a Result<(), std::io::Error>
. Here’s an example of how to save the rendered image:
fn save_image(image: &Image, output_path: &str) -> Result<(), std::io::Error> {
image.save_png(output_path)
}
Now we can combine all the functions to load, render, and save an SVG file as a PNG image:
use resvg::{prelude::*, usvg};
use resvg::Image;
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
let input_file = "assets/example.svg";
let output_file = "output/example.png";
let tree = load_svg(input_file)?;
let options = resvg::Options::default();
let image = render_svg(&tree, &options)?;
save_image(&image, output_file)?;
println!("SVG file successfully converted to PNG!");
Ok(())
}
fn load_svg(file_path: &str) -> Result<usvg::Tree, usvg::Error> {
let tree = usvg::Tree::from_file(file_path, &usvg::Options::default())?;
Ok(tree)
}
fn render_svg(tree: &usvg::Tree, options: &resvg::Options) -> Result<Image, resvg::Error> {
let image = resvg::render(&tree, usvg::FitTo::Original, options)?;
Ok(image)
}
fn save_image(image: &Image, output_path: &str) -> Result<(), std::io::Error> {
image.save_png(output_path)
}
In this tutorial, we discussed how to use the Resvg library in a Rust project, including loading and rendering SVG files, and saving the rendered image as a PNG file. Resvg is a powerful and flexible library that can help you bring SVG support to your Rust applications with ease.