使用 NodeJS 将 OpenType / TrueType 格式转换为 png 图像

Posted

技术标签:

【中文标题】使用 NodeJS 将 OpenType / TrueType 格式转换为 png 图像【英文标题】:Converting OpenType / TrueType format to png images using NodeJS 【发布时间】:2021-10-12 01:04:52 【问题描述】:

我最近遇到了一个问题。

我需要使用以下代码应用程序从字体文件 otf/ttf 生成图像:

let font = loadFont("Verdana.ttf");
font.Generate("Hello world");

将输出一个带有 Verdana 字体的 Hello world 图像。我搜索了一下,找到了可以解析字体文件的库 opentype.js,但我真的不明白下一步该怎么做,有很多数据,我不知道哪个可以曾经做我需要做的事。

说实话,我真的不知道从哪里开始,如果有人有关键字或其他可能对我有用的东西,我很高兴知道。

谢谢。

【问题讨论】:

【参考方案1】:

与其使用 node-canvas 之类的东西(这是 Node 的最佳画布仿真,但也需要在安装时编译并严重依赖 GTK),您可以只要求 OpenType.js 排版文本然后为此获取 SVG:

const font = opentype.load('yourfonthere');
const yourString = `.....`;
const path = font.getPath(yourString, 0, 0);
const pathElementString = path.toSVG();

然后您可以将该路径放入 SVG 文档中:

const  x1, x2, y1, y2  = path.getBoundingBox();
const w = x2 - x1;
const h = y2 - y1;
const svgDocument = `<svg   viewBox="$x1 $y1 $w $h">
  $pathElementString
</svg>`;

现在您有了一个 SVG 文件,您可以将其保存在内存中或写入磁盘。

从 SVG 到 PNG 然后变成“使用任何一种可能的工具,无论是基于节点的(例如convert-svg-to-png)还是CLI-based”,因为您总是可以设置一个看起来用于放置在文件夹/目录中的新 SVG 文件(作为 npm 脚本的一部分,或作为独立的系统任务),或者您可以在将文件写入磁盘后让代码触发 execspawn .

(请记住,如果您使用 CLI 路线,您几乎可以肯定会将您的代码锁定到一个特定的操作系统中,所以……不建议这样做。也就是说,记住这一点总是很重要的,因为您使用的是 Node ,您不必让 Node 做所有事情。将文件写入磁盘,然后使用非常出色的 CLI 实用程序来完成最后一个或多个步骤是一种完全有效的编程方法)

【讨论】:

哦,我首先在搜索类似的东西,谢谢!【参考方案2】:

通过使用 opentype.js 和 canvas 找到了一种方法,只需生成一个虚拟画布,然后将我的文本绘制到其中。完成工作后,我使用 canvas.getDataURL() 函数从 base64 URL 检索数据。使用名为 image-data-uri 的 npm 包将 base64 转换为 png。

const  createCanvas, loadImage  = require('canvas')

const width = this.font.getAdvanceWidth(value);
const canvas = createCanvas(width + 20, 80)
const ctx = canvas.getContext("2d");
const path = this.font.getPath(value, 10, 65, 72);
            
path.fill = "white";
path.draw(ctx);
ImageDataURI.outputFile(canvas.toDataURL("image/png"), `./out.png`);

【讨论】:

如果您要编写代码问题的答案,请记住显示代码。如果您使用 node-canvas 和 opentype.js 使其工作,请显示生成文件的(最少)代码。但是,请注意,更好的解决方案是让 opentype.js 将文本排版为 SVG,然后将该 SVG 保存为 PNG,这样您就不需要需要安装时编译的依赖项,并且会占用大量资源内存量(因为根据定义,画布需要 4xWxH 字节仅用于其位图) 但是你忘记了显示你正在使用哪个画布库的部分,这很重要,因为有几个 =)

以上是关于使用 NodeJS 将 OpenType / TrueType 格式转换为 png 图像的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将CFF字体转换为OpenType字体

将opentype转入paper.js,贝塞尔曲线问题

将 paper.js 路径转换为 ​​opentype.js 路径

opentype.js 和 maker.js 为文本呈现不正确的路径

以编程方式将 CFF 字体转换为 OpenType 字体

无法让 Ghostscript 使用 OpenType 字体