欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > html5 canvas繪制網(wǎng)絡(luò)字體的常用方法

html5 canvas繪制網(wǎng)絡(luò)字體的常用方法

熱門標簽:ok電銷機器人 高德地圖標注商戶怎么標 智能電銷機器人被禁用了么 欣鼎電銷機器人 效果 地圖標注軟件打印出來 電話機器人技術(shù) 黃石ai電銷機器人呼叫中心 惡搞電話機器人 如何查看地圖標注

最近在用canvas繪圖時遇到了一個令人頭痛的問題:canvas繪制網(wǎng)絡(luò)字體時沒效果,遂開始了一番解決方案查找測試,中間也碰到了不少坑,于是寫下此篇文章做個總結(jié),如果大家在用canvas時遇到了同樣的問題,希望對大家有一定的幫助,接下來就來看看有哪幾種解決辦法

服務(wù)端轉(zhuǎn)換
 

服務(wù)端轉(zhuǎn)換是什么意思呢?直接把內(nèi)容和需要的字體傳遞給服務(wù)端,服務(wù)端提供一個文字轉(zhuǎn)圖片的接口,將字體轉(zhuǎn)換成圖片,然后在canvas中直接繪制圖片,這樣就能保證繪制網(wǎng)絡(luò)字體不會有問題,不會有任何的兼容性問題,但是這樣做也就意味著服務(wù)端的工作會變多,同時如果文字內(nèi)容是可以被用戶編輯修改的,那就意味著用戶每操作一次,都要請求一次接口,然后重新繪制一次圖片,這樣會導(dǎo)致網(wǎng)絡(luò)開銷增加,如果不想要服務(wù)端的介入,那就看看下面的解決方案

webfontloader
 

webfontloader是一個由Google和Typekit共同開發(fā)的組件庫,提供了一組標準事件監(jiān)聽字體的加載,雖然已經(jīng)很長時間沒有更新了,但是對字體加載的監(jiān)聽確實有效,下面來看一個具體的例子怎么使用:

var WebFont = require('webfontloader')
var canvas = document.getElementById('canvas')
var ctx = canvas.getContext('2d')
var link = document.createElement('link')
link.rel = 'stylesheet'
link.type = 'text/css'
link.
document.getElementsByTagName('head')[0].appendChild(link)
WebFont.load({
  custom: {
    families: ['Vast Shadow']
  },
  active: function () {
    ctx.font = '50px "Vast Shadow"'
    ctx.textBaseline = 'top'
    ctx.fillText('123', 20, 10)
  }
})

首先通過require引入webfontloader,并且動態(tài)插入一個script標簽載入google的字體,然后調(diào)用webfontloader的load方法進行配置監(jiān)聽,當字體加載完成后就會觸發(fā)active鉤子,開始繪制對應(yīng)字體的內(nèi)容,webfontloader提供了一個完整的事件系統(tǒng)鉤子給開發(fā)者調(diào)用:

 

如果想要了解webfontloader的更多用法可以前往 github 查看學(xué)習(xí),如果你覺得為了繪制網(wǎng)絡(luò)字體需要引入一個js庫有點得不償失,沒關(guān)系,接下來向你接受不用庫的方法

document.fonts.load
 

如果你在Google上搜索canvas加載網(wǎng)絡(luò)字體,你一定能搜到下面這個方案:

var canvas = document.getElementById('canvas')
var ctx = canvas.getContext('2d')
var link = document.createElement('link')
link.rel = 'stylesheet'
link.type = 'text/css'
link.
document.getElementsByTagName('head')[0].appendChild(link)
var image = document.createElement('img')
image.src = link.href
image.onerror = () => {
  ctx.font = '50px "Vast Shadow"'
  ctx.textBaseline = 'top'
  ctx.fillText('123', 20, 10)
}

這個方案存在一點問題,當image onerror事件觸發(fā)的時候,并不能保證字體已經(jīng)加載完成,只能保證css文件已經(jīng)加載完成,因此,在第一次訪問的時候并不會生效:

 

但是你再刷新一下瀏覽器之后字體就生效了:

 

這是什么原因呢?我們來看一下刷新瀏覽器的網(wǎng)絡(luò)請求:

 
 

可以看到后面的字體走的是緩存,因此可以字體可以繪制出來,但是如果將chrome調(diào)試的Disable cache勾選上,將緩存禁用掉,那么無論怎么刷新,字體都不會繪制出來。

 

有解決辦法嗎?答案是有的,使用Font Load API進行加載,來看具體代碼:

var canvas = document.getElementById('canvas')
var ctx = canvas.getContext('2d')
var link = document.createElement('link')
link.rel = 'stylesheet'
link.type = 'text/css'
link.
document.getElementsByTagName('head')[0].appendChild(link)
var image = document.createElement('img')
image.src = link.href
image.onerror = () => {
  document.fonts.load('50px Vast Shadow', '123').then(() => {
    ctx.font = '50px "Vast Shadow"'
    ctx.textBaseline = 'top'
    ctx.fillText('123', 20, 10)
  })
}

 

先用image的onerror事件trick css文件的加載,然后調(diào)用document.fonts.load看字體是否加載完成,這樣就可以準確監(jiān)聽到字體加載完成,但是這個api存在兼容性問題,來看具體表格:

 

想要對這個api了解更多,可以前往 mdn 查看

對比繪制

對比繪制是什么意思呢?就是先設(shè)置一個沒有的字體,然后在設(shè)置我們需要的字體進行對比,來看具體代碼:

var canvas = document.getElementById('canvas')
var ctx = canvas.getContext('2d')
var link = document.createElement('link')
link.rel = 'stylesheet'
link.type = 'text/css'
link.
document.getElementsByTagName('head')[0].appendChild(link)
ctx.font = '50px UNKNOW'
ctx.textBaseline = 'top'
ctx.fillText('123', 20, 10)
var dataDefault = ctx.getImageData(20, 10, 50, 50).data
ctx.clearRect(20, 10, 100, 100)
var detect = () => {
  ctx.font = '50px "Vast Shadow"'
  ctx.textBaseline = 'top'
  ctx.fillText('123', 20, 10)
  var dataNow = ctx.getImageData(20, 10, 50, 50).data
  if ([].slice.call(dataNow).join('') === [].slice.call(dataDefault).join('')) {
    ctx.clearRect(20, 10, 100, 100)
    requestAnimationFrame(detect)
  }
}
detect()

首先設(shè)置一個沒有的字體,繪制上去,然后拿到對應(yīng)區(qū)域的渲染數(shù)據(jù),然后再將渲染區(qū)域清除然后,然后再設(shè)置我們需要的字體,拿到對應(yīng)區(qū)域的渲染數(shù)據(jù),然后實時對比,當渲染數(shù)據(jù)一樣時,表示繪制的都是系統(tǒng)默認字體,我們需要的字體沒有渲染出來,然后執(zhí)行requestAnimationFrame再執(zhí)行detect檢測方法,直到渲染數(shù)據(jù)不一樣,就表示我們需要的字體已經(jīng)渲染完成

總結(jié)

以上所述是小編給大家介紹的html5 canvas繪制網(wǎng)絡(luò)字體的常用方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

標簽:盤錦 萍鄉(xiāng) 金昌 聊城 綏化 中山 赤峰 阿壩

巨人網(wǎng)絡(luò)通訊聲明:本文標題《html5 canvas繪制網(wǎng)絡(luò)字體的常用方法》,本文關(guān)鍵詞  html5,canvas,繪制,網(wǎng)絡(luò),字體,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《html5 canvas繪制網(wǎng)絡(luò)字體的常用方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于html5 canvas繪制網(wǎng)絡(luò)字體的常用方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    爽好久久久欧美精品| 东京热av一区| 91制片厂在线| 久久综合九色综合欧美亚洲| 日韩精品一二三| 日韩少妇一区二区| 在线播放亚洲一区| 亚洲电影第三页| 亚洲黄色小说在线观看| 欧美日韩一区二区在线观看| 亚洲国产日韩av| 佐佐木明希电影| 欧美日韩大陆在线| 五月天中文字幕一区二区| bl动漫在线观看| 日韩一级免费一区| 日韩不卡在线观看日韩不卡视频| 污污污www精品国产网站| 91精品久久久久久久91蜜桃| 丝袜国产日韩另类美女| 久久国产精品影院| 久久人人97超碰com| 国产精品一二三| 欧美做爰爽爽爽爽爽爽| 亚洲品质自拍视频网站| 91在线观看下载| 欧美日韩国产a| 日本aⅴ亚洲精品中文乱码| 色欲av无码一区二区三区| 久久青草欧美一区二区三区| 国产不卡视频在线观看| 午夜av入18在线| 亚洲自拍偷拍麻豆| 国产白嫩美女无套久久| 精品久久一区二区| 国产成人a级片| 在线观看视频欧美| 无吗不卡中文字幕| аⅴ天堂中文在线网| 国产精品久久久久久户外露出| 91免费精品国自产拍在线不卡 | 性久久久久久久久久| 久久综合成人精品亚洲另类欧美 | 日韩三级av在线播放| 久88久久88久久久| 性生交大片免费全黄| 亚洲精品一二三| 亚洲色图14p| 欧美国产精品专区| 制服丝袜av在线| 久久在线观看免费| av一区二区久久| 日韩一区二区三区在线| 国产高清不卡一区| 欧美日韩高清在线播放| 国产呦萝稀缺另类资源| 欧美亚洲高清一区| 久久av中文字幕片| 侵犯稚嫩小箩莉h文系列小说| 亚洲国产视频在线| 国产aaaaaaaaa| 一区二区三区**美女毛片| 国产免费无遮挡吸奶头视频| 亚洲色图一区二区三区| 无码人妻精品一区二区三区温州| 欧美国产97人人爽人人喊| 丰满人妻一区二区三区免费视频棣| 欧美成人精品3d动漫h| 不卡的av在线| 精品国产一区二区三区忘忧草| 北条麻妃一区二区三区| 欧美电影免费观看完整版| 成av人片一区二区| 精品捆绑美女sm三区| 人妻少妇偷人精品久久久任期| 久久这里都是精品| 91精品又粗又猛又爽| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 五月天视频一区| 欧美第一页在线观看| 日本三级亚洲精品| 欧美性欧美巨大黑白大战| 国产自产v一区二区三区c| 欧美精品 日韩| 波多野洁衣一区| 国产亚洲人成网站| 亚洲图片综合网| 亚洲欧美成人一区二区三区| 欧美激情视频二区| 五月婷婷激情综合网| 在线亚洲人成电影网站色www| 国产在线精品一区二区不卡了 | 日韩在线一区二区| 色婷婷久久久久swag精品| 韩国女主播成人在线| 91精品久久久久久久久99蜜臂| 99在线精品一区二区三区| 国产亚洲欧美在线| 在线不卡av电影| 天天操天天干天天综合网| 在线视频综合导航| 成人一区二区三区视频在线观看| 久久综合色天天久久综合图片| 99精品一区二区三区无码吞精 | 伊人久久一区二区三区| 亚洲啪啪综合av一区二区三区| 少妇视频一区二区| 国内精品在线播放| 欧美成人a视频| aaaaa一级片| 欧美a级理论片| 在线综合视频播放| 性活交片大全免费看| 亚洲综合成人网| 欧美午夜精品电影| 91影院在线免费观看| 亚洲欧美偷拍另类a∨色屁股| 三级在线观看免费大全| 国产精一区二区三区| 久久久久久久电影| 亚洲av无码国产精品麻豆天美| 日韩av网站在线观看| 91精品国产综合久久久久久漫画| 性色av蜜臀av浪潮av老女人 | 91精品国自产在线偷拍蜜桃| 丁香婷婷综合色啪| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 欧美丰满熟妇bbb久久久| 一区二区三区久久| 欧美亚洲动漫另类| 国产精品99精品无码视亚| 亚洲制服丝袜av| 欧美日韩国产美| 成人区人妻精品一区二| 婷婷久久综合九色综合绿巨人 | 自拍偷拍亚洲激情| 色综合激情五月| 亚洲av无一区二区三区久久| 亚洲综合视频在线观看| 欧美猛男gaygay网站| 日本黄色动态图| 蜜桃视频在线观看一区| 久久久久久久久久看片| 国产精品夜夜夜爽阿娇| 成人小视频在线| 亚洲另类在线视频| 欧美理论电影在线| 亚洲第九十七页| 久久国产精品无码网站| 国产日产精品1区| 男人与禽猛交狂配| 不卡区在线中文字幕| 一区二区三区在线免费观看 | 91免费视频大全| 亚洲福利一区二区三区| 日韩一级二级三级| 国产大屁股喷水视频在线观看| 成人av片在线观看| 亚洲午夜在线观看视频在线| 欧美一级免费观看| 中文字幕黄色网址| 99久久久无码国产精品| 亚洲成av人在线观看| 2023国产精品自拍| 色94色欧美sute亚洲线路一久| 波多野结衣办公室双飞| 久久成人免费网| 中文字幕中文字幕一区| 欧美日韩一区二区三区高清 | 91黄色激情网站| 中文字幕一区三区久久女搜查官| 久久99久久久久久久久久久| 国产精品二三区| 91精品国产综合久久久久久| 国产一区二区三区视频播放| 91麻豆123| 精品一区二区三区免费视频| 国产精品视频你懂的| 欧美日韩国产另类不卡| 久久午夜精品视频| 91免费小视频| 国产在线一区二区综合免费视频| 亚洲天堂久久久久久久| 日韩三级中文字幕| 91视频免费在线看| 精品人妻无码一区二区三区 | 国产成a人亚洲精品| 香蕉影视欧美成人| 日本一区二区免费在线观看视频 | 婷婷中文字幕综合| 国产精品欧美久久久久无广告| 69堂精品视频| 午夜爽爽爽男女免费观看| 中文在线永久免费观看| av电影在线观看不卡| 久久99久久99| 亚洲小少妇裸体bbw| 欧美韩国日本综合| 日韩三级高清在线| 欧美色图天堂网|