我正在尝试组合一个工具来检查给定字符是否以指定样式字体或系统默认字体显示。我的最终目标是能够检查,至少在现代(阅读:IE8+)浏览器中,给定字体是否支持连字。
我有两个显示相同连字的画布(在本例中为 st)。我将这些画布转换为数据并比较它们以查看字符是否匹配。
Arial(像大多数字体一样)没有 st 连字,因此它回退到默认的 serif 字体。这就是奇怪的地方:虽然它们显示相同的字体,但两个画布没有相同的数据。
为什么?因为它们在画布上的位置并不完全相同。我猜这与字体的不同相对高度有关(一个比另一个略高,尽管字体因字体而异)。差异似乎是一两个像素之一,并且字体因字体而异。
如何解决这个问题?我目前唯一的想法是找到一种方法来测量字体的高度并相应地调整其位置,但不幸的是我不知道该怎么做。我是否可以采取其他方法使这两个图像相同?
你可以看到下面的代码。两个画布都已成功初始化并附加到元素的主体,因此我可以直观地看到正在发生的事情(尽管在我正在处理的实际脚本中这不是必需的)。我已经放弃了初始化和上下文,因为它们都工作得很好。
function checkLig() {
lig = 'fb06' // this is the unicode for the st ligature
canvas0.width = 250;
canvas0.height = 50;
context0.fillStyle = 'rgb(0, 0, 0)';
context0.textBaseline = 'top';
context0.font = 'normal normal normal 40px Arial';
context0.fillText(String.fromCharCode(parseInt(lig, 16)), 0, 0);
var print0 = context0.getImageData(0, 0, 720, 50).data;
canvas1.width = 250;
canvas1.height = 50;
context1.fillStyle = 'rgb(0, 0, 0)';
context1.textBaseline = 'top';
context1.font = 'normal normal normal 40px serif';
context1.fillText(String.fromCharCode(parseInt(lig, 16)), 0, 0);
var print1 = context1.getImageData(0, 0, 720, 50).data;
var i = 0, same = true, len = 720 * 50 * 4;
while (i < len && same === true) {
if (print0[i] !== print1[i]) {
same = false;
}
else {
i++;
}
}
return same;
}