跳转到内容

SVG 与文本渲染

复制本页

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

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

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

参考输出由 govips v2.19.0 / libvips 8.17.3 实际生成。

一行 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 像素宽度内自动换行。透明画布让输出在四个入口之间保持相同的 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 变体合成到固定尺寸的透明画布上,使四个入口的输出尺寸一致(640 × 120)。如果改为按文本自然尺寸输出,字形度量取决于系统安装的字体与 DPI,各入口生成的画布尺寸可能略有差异。