rusttype repo包含一个示例(examples/image.rs),它测量一行文本的边界并将其呈现给图像。基本上就是你要找的,除了中心部分。
// rusttype = "0.9.2"
use rusttype::{point, Font, Scale};
let v_metrics = font.v_metrics(scale);
let glyphs: Vec<_> = font.layout(text, scale, point(0.0, 0.0)).collect();
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
};
我不喜欢总是需要收集到Vec
,同时也需要使用non-integer大小。所以在过去,我创建了我自己的版本,基本上就是这个例子。
一个重要的注意事项是,传递给layout的位置实际上并不重要,因为您只需要大小。但是,如果确实需要渲染glyph,则位置很重要,否则结果将包含锯齿瑕疵。
// rusttype = "0.9.2"
use rusttype::{point, Font, Scale};
fn measure_line(font: &Font, text: &str, scale: Scale) -> (f32, f32) {
let width = font
.layout(text, scale, point(0.0, 0.0))
.map(|g| g.position().x + g.unpositioned().h_metrics().advance_width)
.last()
.unwrap_or(0.0);
let v_metrics = font.v_metrics(scale);
let height = v_metrics.ascent - v_metrics.descent + v_metrics.line_gap;
(width, height)
}
如果文本有多行,那么您需要手动在字符串上使用.lines()
,然后将行高和行距相加。
评论功能已关闭。