GOOGLE ADS

вторник, 12 апреля 2022 г.

Как использовать информацию о системном шрифте для заполнения свойства шрифта холста?

Я экспериментирую с Node Canvas (реализация HTML5 Canvas в NodeJS), пытаясь написать простой текст разными шрифтами.

Я могу вытащить данные системного шрифта, используя функцию node-system-fontsбиблиотеки, getavailablefontsкоторая дает мне такие данные, как

[
{
"path": "/Library/Fonts/AcademyEngravedLet.ttf",
"postscriptName": "AcademyEngravedLetPlain",
"family": "Academy Engraved LET",
"style": "Plain",
"weight": 400,
"width": 5
},
{
"path": "/Library/Fonts/Impact.ttf",
"postscriptName": "Impact",
"family": "Impact",
"style": "Regular",
"weight": 900,
"width": 4
}
]

В самом холсте я могу указать информацию о шрифте с помощью fontстроки, как описано в w3schools.com/TAgs/canvas_font.


import { createCanvas } from "canvas";
import { WIDTH, HEIGHT } from "../config";
const write = (text, font, fontStyle) => {
const canvas = createCanvas(WIDTH, HEIGHT);
const ctx = canvas.getContext("2d");
ctx.fillStyle = "black";
ctx.font = `${Math.abs(WIDTH / Math.PI)}px ${font}`;
ctx.fontStyle = fontStyle;
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.fillText(text, WIDTH / 2, HEIGHT / 2, WIDTH - 20); // text, x, y, max width
return canvas;
};

Но я изо всех сил пытаюсь правильно связать шрифт familyи styleданные шрифта с тем, что должно войти в ctx.fontсвойство.

В случае Impact строка шрифта 200px Impactдает мне системный шрифт по умолчанию, а не шрифт Impact. Но 200px Academy Engraved LETработает нормально.

Кроме того, установка ctx.fontStyleсвойства на значение свойства шрифта, styleпохоже, ничего не делает.

Есть ли где-нибудь документация, объясняющая, как сопоставить системные шрифты со свойством шрифта холста?


Решение проблемы

После небольшого копания в фактическом canvasисточнике у меня это работает.

/**
* Convert the font data into a font string.
*
* @param {string} size A font size string (eg 100px or 50%/55% etc)
* @param {object} font The font data, including `{ style, family }`
* @returns {string} The font string
*/
const stringifyFont = (size, { style, family }) =>
[style, size, family].filter(Boolean).map(String).join(" ");
export default stringifyFont;

Я также обнаружил, что это помогло зарегистрировать шрифты, поскольку это помогло мне отсеять шрифты, которые по разным причинам просто не работают.

import { registerFont } from "canvas";
const registerFonts = (fonts) => {
fonts.forEach(({ path, family, weight, style }) => {
registerFont(path, { family, weight, style });
});
};
export default registerFonts;

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...