這篇文章帶給大家的內容是關於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中文網其他相關文章!

html5的div元素默认一行不可以放两个。div是一个块级元素,一个元素会独占一行,两个div默认无法在同一行显示;但可以通过给div元素添加“display:inline;”样式,将其转为行内元素,就可以实现多个div在同一行显示了。

html5中列表和表格的区别:1、表格主要是用于显示数据的,而列表主要是用于给数据进行布局;2、表格是使用table标签配合tr、td、th等标签进行定义的,列表是利用li标签配合ol、ul等标签进行定义的。

固定方法:1、使用header标签定义文档头部内容,并添加“position:fixed;top:0;”样式让其固定不动;2、使用footer标签定义尾部内容,并添加“position: fixed;bottom: 0;”样式让其固定不动。

html5中不支持的标签有:1、acronym,用于定义首字母缩写,可用abbr替代;2、basefont,可利用css样式替代;3、applet,可用object替代;4、dir,定义目录列表,可用ul替代;5、big,定义大号文本等等。

HTML5中画布标签是“<canvas>”。canvas标签用于图形的绘制,它只是一个矩形的图形容器,绘制图形必须通过脚本(通常是JavaScript)来完成;开发者可利用多种js方法来在canvas中绘制路径、盒、圆、字符以及添加图像等。

html5废弃了dir列表标签。dir标签被用来定义目录列表,一般和li标签配合使用,在dir标签对中通过li标签来设置列表项,语法“<dir><li>列表项值</li>...</dir>”。HTML5已经不支持dir,可使用ul标签取代。

3种取消方法:1、给td元素添加“border:none”无边框样式即可,语法“td{border:none}”。2、给td元素添加“border:0”样式,语法“td{border:0;}”,将td边框的宽度设置为0即可。3、给td元素添加“border:transparent”样式,语法“td{border:transparent;}”,将td边框的颜色设置为透明即可。

因为html5不基于SGML(标准通用置标语言),不需要对DTD进行引用,但是需要doctype来规范浏览器的行为,也即按照正常的方式来运行,因此html5只需要写doctype即可。“!DOCTYPE”是一种标准通用标记语言的文档类型声明,用于告诉浏览器编写页面所用的标记的版本。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3漢化版
中文版,非常好用

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SublimeText3 Linux新版
SublimeText3 Linux最新版