blob: 66091bf39d02a69f1e6a246799afa55e36a66fc4 [file] [log] [blame]
use image::{DynamicImage, Rgba};
use rusttype::{point, Font, Scale};
fn main() {
// Load the font
let font_data = include_bytes!("../fonts/wqy-microhei/WenQuanYiMicroHei.ttf");
// This only succeeds if collection consists of one font
let font = Font::from_bytes(font_data as &[u8]).expect("Error constructing Font");
// The font size to use
let scale = Scale::uniform(32.0);
// The text to render
let text = "This is RustType rendered into a png!";
// Use a dark red colour
let colour = (150, 0, 0);
let v_metrics = font.v_metrics(scale);
// layout the glyphs in a line with 20 pixels padding
let glyphs: Vec<_> = font
.layout(text, scale, point(20.0, 20.0 + v_metrics.ascent))
.collect();
// work out the layout size
let glyphs_height = (v_metrics.ascent - v_metrics.descent).ceil() as u32;
let glyphs_width = {
let min_x = glyphs
.first()
.map(|g| g.pixel_bounding_box().unwrap().min.x)
.unwrap();
let max_x = glyphs
.last()
.map(|g| g.pixel_bounding_box().unwrap().max.x)
.unwrap();
(max_x - min_x) as u32
};
// Create a new rgba image with some padding
let mut image = DynamicImage::new_rgba8(glyphs_width + 40, glyphs_height + 40).to_rgba();
// Loop through the glyphs in the text, positing each one on a line
for glyph in glyphs {
if let Some(bounding_box) = glyph.pixel_bounding_box() {
// Draw the glyph into the image per-pixel by using the draw closure
glyph.draw(|x, y, v| {
image.put_pixel(
// Offset the position by the glyph bounding box
x + bounding_box.min.x as u32,
y + bounding_box.min.y as u32,
// Turn the coverage into an alpha value
Rgba {
data: [colour.0, colour.1, colour.2, (v * 255.0) as u8],
},
)
});
}
}
// Save the image to a png file
image.save("image_example.png").unwrap();
println!("Generated: image_example.png");
}