HTML5 Canvas 填充文本和字体

Posted

技术标签:

【中文标题】HTML5 Canvas 填充文本和字体【英文标题】:HTML5 Canvas filltext and font-face 【发布时间】:2012-01-02 04:39:00 【问题描述】:

一直在寻找 *** 和 google 的方法来解决我遇到的这个问题,但没有太多的解决方案。

发生的事情是我的 font-face 字体没有在正确的时间加载。我正在做的是我有一个 html5 画布和 javascript,我在其中绘制了一些简单的圆圈,其中包含填充文本。现在圆圈正在绘制,但文本本身的字体是错误的。

我假设原因是因为字体是最后加载的,它只是选择了默认字体。

现在我的问题是……有没有办法可以延迟画布对象的绘制,直到字体加载完成?这样字体就可以使用了,它会为画布对象分配正确的字体。

我应该指出,我有一个 index.php 文件,其中包含我的其他 php 文件,其中实际上正在绘制 javascript 和 canvas。

【问题讨论】:

一直在尝试许多不同的方法来使其正常工作,但似乎在页面加载结束时字体仍在加载。所以画布填充文本不会以正确的字体呈现。有什么想法吗? 【参考方案1】:

使用this trick 并将onerror 事件绑定到Image 元素。

此处的演示:http://jsfiddle.net/g6LyK/ — 适用于最新的 Chrome。

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

var link = document.createElement('link');
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = 'http://fonts.googleapis.com/css?family=Vast+Shadow';
document.getElementsByTagName('head')[0].appendChild(link);

// Trick from https://***.com/questions/2635814/
var image = new Image;
image.src = link.href;
image.onerror = function() 
    ctx.font = '50px "Vast Shadow"';
    ctx.textBaseline = 'top';
    ctx.fillText('Hello!', 20, 10);
;

【讨论】:

这行得通,但是我的 javascript 生成画布内容的方式似乎无法让它按照我需要的方式工作。我有一个包含多个字符串的数组,需要将每个字符串写入画布上的新图像。它通过一个for循环。有什么建议吗? 只要您的代码在image.onerror 回调中执行,您就应该能够使用该字体。试着把你的循环放在那里。【参考方案2】:

According to an answer to this question,您可能需要监听 onreadystatechange 事件,检查 document.readystate === 'complete'。

【讨论】:

以上是关于HTML5 Canvas 填充文本和字体的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 画布中的中心(比例字体)文本

[js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)

HTML5 Canvas - 用随机像素颜色填充形状?

从 HTML5 Canvas 上的图像绘制字体

设置 HTML5 Canvas 的背景填充、描边和不透明度

Html5 Canvas Text