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(),然后将行高和行距相加。