首頁 >web前端 >H5教程 >Canvas跨域的解決方案介紹

Canvas跨域的解決方案介紹

不言
不言轉載
2018-11-16 17:22:324852瀏覽

這篇文章帶給大家的內容是關於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 跨域

正常情況下,如果需要將繪製好的影像輸出,我們可以呼叫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跨域的解決方案介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除