Canvas 跨域如何解決?這裡記錄下使用Canvas 繪圖過程中所遇到的跨域問題和解決方案。
先來看下實現方法。
實作方法目標圖片一般是由圖片+ 文字構成。無論是千奇百怪的大小圖片,或是變幻莫測的各式文本,都能用canvas api drawImage 和fillText 方法來完成。
基本流程如下:
1、獲取canvas 上下文-- ctx
const canvas = document.querySelector(selector)const ctx = canvas.getContext('2d')2、繪圖
忽略圖片上的內容,直接用drawImage 畫到canvas 畫布上即可。
const image = new Image()image.src = srcimage.onload = () => { ctx.save() // 這裡我們採用以下參數呼叫this.ctx.drawImage(image, dx, dy, dWidth, dHeight) this .ctx.restore()}drawImage 有3種參數使用方式,具體用法可以查看MDN 文件。
3、取得影像數據
呼叫HTMLCanvasElement DOM 物件提供的toBlob(), toDataURL() 或getImageData() 方法,即可。
canvas.toBlob(blob => { // 你要的blob}, mimeType, encoderOptions)這裡的mimeType 預設值為image/png。 encoderOptions 指定了圖片質量,可用於壓縮,不過需要mimeType 格式為image/jpeg 或image/webp。
Canvas 跨域正常情況下,如果需要將繪製好的影像輸出,我們可以呼叫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
如此,你便可以拿到圖片資料了。如果沒招,就換同域資源吧~
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。