摘要:跨域如何解決這里記錄下使用繪圖過(guò)程中所遇到的跨域問(wèn)題和解決方案。先來(lái)看下實(shí)現(xiàn)方法??缬蛘G闆r下,如果需要將繪制好的圖像輸出,我們可以調(diào)用的或方法來(lái)獲取到圖像數(shù)據(jù)。然而,遇到圖片跨域的情況就有些尷尬了。
Canvas 跨域如何解決?這里記錄下使用 Canvas 繪圖過(guò)程中所遇到的跨域問(wèn)題和解決方案。
先來(lái)看下實(shí)現(xiàn)方法。
實(shí)現(xiàn)方法目標(biāo)圖片一般是由 圖片 + 文本 構(gòu)成。無(wú)論是千奇百怪的大小圖片,還是變幻莫測(cè)的各式文本,都能用 canvas api drawImage 和 fillText 方法來(lái)完成。
基本流程如下:
獲取 canvas 上下文 -- ctx
const canvas = document.querySelector(selector) const ctx = canvas.getContext("2d")
繪圖
忽略圖片上的內(nèi)容,直接用 drawImage 將其畫到 canvas 畫布上即可。
const image = new Image() image.src = src image.onload = () => { ctx.save() // 這里我們采用以下參數(shù)調(diào)用 this.ctx.drawImage(image, dx, dy, dWidth, dHeight) this.ctx.restore() }
drawImage 有3種參數(shù)使用方式,具體用法可以查看 MDN 文檔。
獲取圖像數(shù)據(jù)
調(diào)用 HTMLCanvasElement DOM 對(duì)象提供的 toBlob(), toDataURL() 或 getImageData() 方法,即可。
canvas.toBlob(blob => { // 你要的 blob }, mimeType, encoderOptions)
這里的 mimeType 默認(rèn)值為 image/png。encoderOptions 指定了圖片質(zhì)量,可用于壓縮,不過(guò)需要 mimeType 格式為 image/jpeg 或者 image/webp。
Canvas 跨域正常情況下,如果需要將繪制好的圖像輸出,我們可以調(diào)用 canvas 的 toBlob(), toDataURL() 或 getImageData() 方法來(lái)獲取到圖像數(shù)據(jù)。然而,遇到圖片跨域的情況就有些尷尬了??赡芑貓?bào)如下錯(cuò)誤:
Failed to execute "toBlob" on "HTMLCanvasElement": Tainted canvases may not be exported.
或者
Access to image at "https://your.image.src" from origin "https://your.website" has been blocked by CORS policy: No "Access-Control-Allow-Origin" header is present on the requested resource.
先來(lái)看看第2種情況。
Access-Control-Allow-Origin
如果你跨域使用某些圖片資源,并且該服務(wù)未正確響應(yīng) Access-Control-Allow-Origin 頭信息, 則會(huì)報(bào)出如下錯(cuò)誤信息:
Access to image at "https://your.image.src" from origin "https://your.website" has been blocked by CORS policy: No "Access-Control-Allow-Origin" header is present on the requested resource.
說(shuō)明不允許跨域訪問(wèn),那么你可以試著讓后臺(tái)修改 Access-Control-Allow-Origin 的值為 * 或 your.website, 或者改用同域資源(考慮下?)。
接下來(lái),我們來(lái)解決第1種情況。
img.crossOrigin = "Anonymous"
為避免未經(jīng)許可拉取遠(yuǎn)程網(wǎng)站信息而導(dǎo)致的用戶隱私泄露(如 GPS 等信息,具體可搜索 Exif),在調(diào)用 canvas 的 toBlob(), toDataURL() 或 getImageData() 會(huì)拋出安全錯(cuò)誤:
Failed to execute "toBlob" on "HTMLCanvasElement": Tainted canvases may not be exported.
如果你的圖片服務(wù)允許跨域使用(如果不允許,見(jiàn)上條),那么你該考慮下給 img 元素加上 crossOrigin 屬性,即:
const image = new Image() image.crossOrigin = "Anonymous" image.src = src
如此,你便可以拿到圖片數(shù)據(jù)了。如果沒(méi)招,換同域資源吧~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99029.html
摘要:我的書簽我的書簽謹(jǐn)慎導(dǎo)入,小心覆蓋工具類版本管理快速切換源配置教程指南可視化工具前端工具集前端助手網(wǎng)絡(luò)封包截取工具格式化工具標(biāo)注工具模擬請(qǐng)求類深入淺出布局你所不知道的動(dòng)畫技巧與細(xì)節(jié)常用代碼黑魔法小技巧,讓你少寫不必要的,代碼更優(yōu)雅一勞永 我的書簽 我的書簽(謹(jǐn)慎導(dǎo)入,小心覆蓋) 工具類 nvm: node版本管理 nrm: 快速切換npm源 shell: zsh+on-my-zsh配...
摘要:我的書簽我的書簽謹(jǐn)慎導(dǎo)入,小心覆蓋工具類版本管理快速切換源配置教程指南可視化工具前端工具集前端助手網(wǎng)絡(luò)封包截取工具格式化工具標(biāo)注工具模擬請(qǐng)求類深入淺出布局你所不知道的動(dòng)畫技巧與細(xì)節(jié)常用代碼黑魔法小技巧,讓你少寫不必要的,代碼更優(yōu)雅一勞永 我的書簽 我的書簽(謹(jǐn)慎導(dǎo)入,小心覆蓋) 工具類 nvm: node版本管理 nrm: 快速切換npm源 shell: zsh+on-my-zsh配...
摘要:過(guò)程中一些常見(jiàn)的問(wèn)題講真這本篇文章真的是良心文章,感覺(jué)作者了,一些見(jiàn)到過(guò)沒(méi)見(jiàn)到過(guò)的問(wèn)題都差不多能找到了。 Vue過(guò)程中一些常見(jiàn)的問(wèn)題 講真這本篇文章真的是良心文章,感覺(jué)作者了,一些見(jiàn)到過(guò)沒(méi)見(jiàn)到過(guò)的問(wèn)題都差不多能找到了。
閱讀 2097·2021-10-08 10:21
閱讀 2490·2021-09-29 09:34
閱讀 3505·2021-09-22 15:51
閱讀 4946·2021-09-22 15:46
閱讀 2324·2021-08-09 13:42
閱讀 3447·2019-08-30 15:52
閱讀 2734·2019-08-29 17:13
閱讀 1564·2019-08-29 11:30