跳转到内容

SVG 与文本渲染

复制本页

渲染文本是标签、说明文字和水印构建的常见第一步。libvips 通过 Pango 渲染文本,因此支持标记(<i> 斜体、<span foreground=...> 颜色)、自动换行与对齐。本 Recipe 渲染三种文本样式——基础、自动换行、Pango 标记——分别合成到透明的 640 × 120 RGBA 画布上,并导出为保留 Alpha 的 PNG。

输入是一张尺寸已知、内容为空的透明 SVG 画布;在本 Recipe 中它作为中性基底,不参与合成。

用作文本渲染基底的空白透明 SVG 画布
输入:SVG800 × 200,透明

参考输出由 govips v2.19.0 / libvips 8.17.3 实际生成。跨 binding 逐像素对比仍在进行。

一行 DejaVu Sans 28 文本,渲染为 RGBA 并放在画布左上角。

透明画布上的单行 VIPS Handbook 文本
text-basic:PNGDejaVu Sans 28,RGBA
txt, err := vips.Text(&vips.TextParams{
Text: "VIPS Handbook",
Font: "DejaVu Sans 28",
DPI: 72,
RGBA: true,
Wrap: vips.TextWrapWord,
})

一句较长的句子以 DejaVu Sans 20 在 320 像素宽度内自动换行。透明画布让输出在各 binding 之间保持相同的 640 × 120 尺寸。

在 320 像素宽度内自动换行的长句,位于透明画布中
text-wrapped:PNGDejaVu Sans 20,宽度 320,按词换行
txt, err := vips.Text(&vips.TextParams{
Text: "The libvips demand-driven pipeline keeps memory flat while processing large images in production.",
Font: "DejaVu Sans 20",
DPI: 72,
Width: 320,
RGBA: true,
Wrap: vips.TextWrapWord,
})

Pango 标记可以在同一个字符串里混合字体粗细、颜色与斜体:粗体紫色的 VIPS 后跟着斜体 Handbook。

在透明画布上混合粗体紫色与斜体的 Pango 标记文本
text-pango:PNGPango 标记,RGBA
txt, err := vips.Text(&vips.TextParams{
Text: "<span font_desc='DejaVu Sans' font_size='30000' font_weight='bold' foreground='#5d2f86'>VIPS</span> <i>Handbook</i>",
Font: "DejaVu Sans",
DPI: 72,
RGBA: true,
Wrap: vips.TextWrapWord,
})

文本渲染是少数具有可移植核心的“绘图”类操作,但 API 形态各不相同:

  • govips 提供手写的 vips.Text(*TextParams) 辅助函数,返回独立的 *ImageRef。
  • sharp 没有独立的文本方法;文本作为叠加层通过 composite([{ input: { text: {...} } }]) 渲染。
  • pyvips 直接暴露 pyvips.Image.text(...)。
  • vips CLI 暴露 vips text。

在这里,换行与 Pango 变体有意合成到固定尺寸的透明画布上,使四个 binding 的输出尺寸一致(640 × 120)。如果改为按文本自然尺寸渲染,字形度量取决于系统安装的字体与 DPI,各 binding 的输出可能不同。