您好,登錄后才能下訂單哦!
這篇文章主要介紹了Canvas跨域如何解決,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
Canvas 跨域如何解決?這里記錄下使用 Canvas 繪圖過程中所遇到的跨域問題和解決方案。
先來看下實現方法。
實現方法
目標圖片一般是由 圖片 + 文本 構成。無論是千奇百怪的大小圖片,還是變幻莫測的各式文本,都能用 canvas api drawImage 和 fillText 方法來完成。
基本流程如下:
獲取 canvas 上下文 -- ctx
const canvas = document.querySelector(selector) const ctx = canvas.getContext('2d')
繪圖
忽略圖片上的內容,直接用 drawImage 將其畫到 canvas 畫布上即可。
const image = new Image() image.src = src image.onload = () => { ctx.save() // 這里我們采用以下參數調用 this.ctx.drawImage(image, dx, dy, dWidth, dHeight) this.ctx.restore() }
drawImage 有3種參數使用方式,具體用法可以查看 MDN 文檔。
獲取圖像數據
調用 HTMLCanvasElement DOM 對象提供的 toBlob(), toDataURL() 或 getImageData() 方法,即可。
canvas.toBlob(blob => { // 你要的 blob }, mimeType, encoderOptions)
這里的 mimeType 默認值為 image/png。encoderOptions 指定了圖片質量,可用于壓縮,不過需要 mimeType 格式為 image/jpeg 或者 image/webp。
正常情況下,如果需要將繪制好的圖像輸出,我們可以調用 canvas 的 toBlob(), toDataURL() 或 getImageData() 方法來獲取到圖像數據。然而,遇到圖片跨域的情況就有些尷尬了。可能回報如下錯誤:
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.
先來看看第2種情況。
Access-Control-Allow-Origin
如果你跨域使用某些圖片資源,并且該服務未正確響應 Access-Control-Allow-Origin 頭信息, 則會報出如下錯誤信息:
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.
說明不允許跨域訪問,那么你可以試著讓后臺修改 Access-Control-Allow-Origin 的值為 * 或 your.website, 或者改用同域資源(考慮下?)。
接下來,我們來解決第1種情況。
img.crossOrigin = 'Anonymous'
為避免未經許可拉取遠程網站信息而導致的用戶隱私泄露(如 GPS 等信息,具體可搜索 Exif),在調用 canvas 的 toBlob(), toDataURL() 或 getImageData() 會拋出安全錯誤:
Failed to execute 'toBlob' on 'HTMLCanvasElement': Tainted canvases may not be exported.
如果你的圖片服務允許跨域使用(如果不允許,見上條),那么你該考慮下給 img 元素加上 crossOrigin 屬性,即:
const image = new Image() image.crossOrigin = 'Anonymous' image.src = src
感謝你能夠認真閱讀完這篇文章,希望小編分享Canvas跨域如何解決內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。