麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > HTML > 正文

詳解Canvas 跨域脫坑實踐

2024-08-26 00:21:08
字體:
供稿:網(wǎng)友

Canvas 跨域如何解決?這里記錄下使用 Canvas 繪圖過程中所遇到的跨域問題和解決方案。

先來看下實現(xiàn)方法。

實現(xiàn)方法

目標圖片一般是由 圖片 + 文本 構(gòu)成。無論是千奇百怪的大小圖片,還是變幻莫測的各式文本,都能用 canvas api drawImage 和 fillText 方法來完成。

基本流程如下:

1、獲取 canvas 上下文 -- ctx

const canvas = document.querySelector(selector)const ctx = canvas.getContext('2d')

2、繪圖

忽略圖片上的內(nèi)容,直接用 drawImage 將其畫到 canvas 畫布上即可。

const image = new Image()image.src = srcimage.onload = () => {    ctx.save()    // 這里我們采用以下參數(shù)調(diào)用    this.ctx.drawImage(image, dx, dy, dWidth, dHeight)    this.ctx.restore()}

drawImage 有3種參數(shù)使用方式,具體用法可以查看MDN 文檔。

3、獲取圖像數(shù)據(jù)

調(diào)用 HTMLCanvasElement DOM 對象提供的 toBlob(), toDataURL() 或 getImageData() 方法,即可。

canvas.toBlob(blob => {    // 你要的 blob}, mimeType, encoderOptions)

這里的 mimeType 默認值為 image/png。encoderOptions 指定了圖片質(zhì)量,可用于壓縮,不過需要 mimeType 格式為 image/jpeg 或者 image/webp。

Canvas 跨域

正常情況下,如果需要將繪制好的圖像輸出,我們可以調(diào)用 canvas 的 toBlob(), toDataURL() 或 getImageData() 方法來獲取到圖像數(shù)據(jù)。然而,遇到圖片跨域的情況就有些尷尬了。可能回報如下錯誤:

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

如果你跨域使用某些圖片資源,并且該服務(wù)未正確響應(yīng) 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'

為避免未經(jīng)許可拉取遠程網(wǎng)站信息而導(dǎo)致的用戶隱私泄露(如 GPS 等信息,具體可搜索 Exif),在調(diào)用 canvas 的 toBlob(), toDataURL() 或 getImageData() 會拋出安全錯誤:

Failed to execute 'toBlob' on 'HTMLCanvasElement': Tainted canvases may not be exported.

如果你的圖片服務(wù)允許跨域使用(如果不允許,見上條),那么你該考慮下給 img 元素加上 crossOrigin 屬性,即:

const image = new Image()image.crossOrigin = 'Anonymous'image.src = src

如此,你便可以拿到圖片數(shù)據(jù)了。如果沒招,換同域資源吧~

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到HTML教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 91精品久久久久久久久 | 精品国产一区二区三区免费 | 久久一区三区 | 亚洲午夜在线观看 | 深夜免费视频 | 91美女啪啪| 日韩精品久久久久久 | 国产精品久久久久久久久久东京 | 成年人在线免费播放视频 | 国产成人高清在线观看 | 久久老司机| 午色影院 | 最污网站| 中文字幕网站在线 | 黄网站免费入口 | 91 免费看片 | 色视频在线 | 亚洲国产成人久久成人52 | 日韩一级视频 | 亚洲第一精品在线 | 91成人免费网站 | 欧美aⅴ视频 | 深夜影院一级毛片 | 媚药按摩痉挛w中文字幕 | 91久久线看在观草草青青 | 一夜新娘第三季免费观看 | 亚洲精品一区中文字幕 | 国产一级毛片高清视频完整版 | 欧美不卡| 久久久久久久久久久久久久久久久久 | 成人免费福利网站 | 在线成人免费网站 | 欧美视频国产 | 啊~用cao嗯力cao烂我视频 | 一级毛片大片 | 国产午夜精品一区二区三区在线观看 | 成人三级电影网站 | 午夜在线视频一区二区三区 | 黄网站免费观看视频 | 圆产精品久久久久久久久久久 | 久久久久久中文字幕 |