亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > HTML5 > 正文

詳解如何解決canvas圖片getImageData,toDataURL跨域問題

2024-09-05 07:22:40
字體:
來源:轉載
供稿:網友

一、首先,圖片服務器需要配置Access-Control-Allow-Origin

一般團隊都會有一個專門域名放置靜態資源,例如騰訊是gtimg.com,百度是bdimg.com;或者很多團隊使用的是騰訊云或者阿里云的服務。

而主頁面所在域名往往不一樣,當需要需要對canvas圖片進行getImageData()或toDataURL()操作的時候,跨域問題就出來了,而且跨域問題還不止一層。

首先,第一步,圖片服務器需要配置Access-Control-Allow-Origin信息,例如:

如PHP添加響應頭信息,*通配符表示允許任意域名:

header("Access-Control-Allow-Origin: *");

或者指定域名:

header("Access-Control-Allow-Origin: www.zhangxinxu.com");

此時,Chrome瀏覽器就不會有Access-Control-Allow-Origin相關的錯誤信息了,但是,還會有其他的跨域錯誤信息。

二、canvas圖片getImageData cross-origin跨域問題

對于跨域的圖片,只要能夠在網頁中正常顯示出來,就可以使用canvas的drawImage() API繪制出來。但是如果你想更進一步,通過getImageData()方法獲取圖片的完整的像素信息,則多半會出錯。

舉例來說,使用下面代碼獲取github上的自己頭像圖片信息:

var canvas = document.createElement('canvas');var context = canvas.getContext('2d');var img = new Image();img.onload = function () {    context.drawImage(this, 0, 0);    context.getImageData(0, 0, this.width, this.height);};img.src = 'https://avatars3.githubusercontent.com/u/496048?s=120&v=4';';

結果在Chrome瀏覽器下顯示如下錯誤:

Uncaught DOMException: Failed to execute ‘getImageData’ on ‘CanvasRenderingContext2D’: The canvas has been tainted by cross-origin data.

Firefox瀏覽器錯誤為:

SecurityError: The operation is insecure.

如果使用的是canvas.toDataURL()方法,則會報:

Failed to execute ‘toDataURL’ on ’HTMLCanvasElement’: Tainted canvased may not be exported

原因其實都是一樣的,跨域導致。

那有沒有什么辦法可以解決這個問題呢?

可以試試crossOrigin屬性。

三、HTML crossOrigin屬性解決資源跨域問題

在HTML5中,有些元素提供了支持CORS(Cross-Origin Resource Sharing)(跨域資源共享)的屬性,這些元素包括<img>,<video>,<script>等,而提供的屬性名就是crossOrigin屬性。

因此,上面的跨域問題可以這么處理:

var canvas = document.createElement('canvas');var context = canvas.getContext('2d');var img = new Image();img.crossOrigin = '';img.onload = function () {    context.drawImage(this, 0, 0);    context.getImageData(0, 0, this.width, this.height);};img.src = 'https://avatars3.githubusercontent.com/u/496048?s=120&v=4';';

增加一個img.crossOrigin = ''即可,雖然JS代碼這里設置的是空字符串,實際上起作用的屬性值是anonymous。

crossOrigin可以有下面兩個值:

關鍵字 釋義
anonymous 元素的跨域資源請求不需要憑證標志設置。
use-credentials 元素的跨域資源請求需要憑證標志設置,意味著該請求需要提供憑證。

其中,只要crossOrigin的屬性值不是use-credentials,全部都會解析為anonymous,包括空字符串,包括類似'abc'這樣的字符。

例如:

img.crossOrigin = 'abc';console.log(img.crossOrigin);    // 結果是'anonymous'

另外還有一點需要注意,那就是雖然沒有crossOrigin屬性,和設置crossOrigin="use-credentials"在默認情況下都會報跨域出錯,但是性質上卻不一樣,兩者有較大區別。

crossOrigin兼容性

IE11+(IE Edge),Safari,Chrome,Firefox瀏覽器均支持,IE9和IE10會報SecurityError安全錯誤,如下截圖:

四、crossOrigin屬性為什么可以解決資源跨域問題?

crossOrigin=anonymous相對于告訴對方服務器,你不需要帶任何非匿名信息過來。例如cookie,因此,當前瀏覽器肯定是安全的。

就好比你要去別人家里拿一件衣服,crossOrigin=anonymous相對于告訴對方,我只要衣服,其他都不要。如果不說,可能對方在衣服里放個竊聽器什么的,就不安全了,瀏覽器就會阻止。

五、IE10瀏覽器不支持crossOrigin怎么辦?

我們請求圖片的時候,不是直接通過new Image(),而是借助ajax和URL.createObjectURL()方法曲線救國。

代碼如下:

var xhr = new XMLHttpRequest();xhr.onload = function () {    var url = URL.createObjectURL(this.response);    var img = new Image();    img.onload = function () {        // 此時你就可以使用canvas對img為所欲為了        // ... code ...        // 圖片用完后記得釋放內存        URL.revokeObjectURL(url);    };    img.src = url;};xhr.open('GET', url, true);xhr.responseType = 'blob';xhr.send();

此方法不僅IE10瀏覽器OK,原本支持crossOrigin的諸位瀏覽器也是支持的。

也就多走一個ajax請求,還可以!

根據,根據實踐發現,在IE瀏覽器下,如果請求的圖片過大,幾千像素那種,圖片會加載失敗,我猜是超過了blob尺寸限制。

六、結束語

最近工作中學到的一點小經驗,希望可以幫到遇到類似問題的小伙伴。也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩高清av一区二区三区| 日韩成人免费视频| 色妞色视频一区二区三区四区| 久久精品国产欧美亚洲人人爽| 国产精品男人爽免费视频1| 精品久久中文字幕| 在线播放日韩专区| 色午夜这里只有精品| 精品久久香蕉国产线看观看gif| 热久久美女精品天天吊色| 亚洲精品按摩视频| 久久久亚洲国产天美传媒修理工| 久久99热这里只有精品国产| 国产精品免费视频xxxx| 国产主播精品在线| 国产精品视频久久| 亚洲精品视频中文字幕| 亚洲欧美日本伦理| 久久亚洲一区二区三区四区五区高| 久久99国产精品久久久久久久久| 欧美日韩国产色| 欧美日韩在线观看视频小说| 日韩乱码在线视频| 亚洲跨种族黑人xxx| 久久久久久久久91| 亚洲欧美在线免费| 伊人久久综合97精品| xxxx欧美18另类的高清| 欧美与黑人午夜性猛交久久久| 亚洲电影天堂av| 中文字幕日韩精品在线观看| 久久久www成人免费精品张筱雨| 久久精品99久久久香蕉| 国产va免费精品高清在线| 国产日本欧美一区二区三区| 美日韩精品免费视频| 成人黄色生活片| 国产精品高潮视频| 久久亚洲精品中文字幕冲田杏梨| 日日骚久久av| 色与欲影视天天看综合网| 91av在线播放视频| 美女福利精品视频| 久久91亚洲人成电影网站| 亚洲成av人片在线观看香蕉| 国产欧美精品久久久| 欧美性xxxx极品高清hd直播| 亚洲欧洲在线播放| 草民午夜欧美限制a级福利片| 久久久精品视频成人| 日本国产一区二区三区| www.亚洲男人天堂| 久久这里只有精品99| 日韩在线观看免费网站| 91网站在线免费观看| 久久精品中文字幕免费mv| 91精品国产成人| 亚洲无限乱码一二三四麻| 欧美精品激情视频| 2018中文字幕一区二区三区| 国产精品一区二区三区毛片淫片| 亚洲国产精品人久久电影| 国产精品福利小视频| 久久综合久中文字幕青草| 日韩成人激情视频| 欧美俄罗斯性视频| 最近2019中文字幕大全第二页| 国产成人福利视频| 精品无人区乱码1区2区3区在线| 国内精品久久久久久久久| 78m国产成人精品视频| 久久精品一偷一偷国产| 欧美日韩中文字幕在线| 欧美性xxxxx极品| 国产精品久久久久99| 国产成人精品一区二区在线| 国产精品福利在线观看| 免费91麻豆精品国产自产在线观看| 成人午夜黄色影院| 国产97在线|亚洲| 97色在线视频观看| 亚洲欧美国产高清va在线播| 久久亚洲精品网站| 久久久天堂国产精品女人| 日韩欧美中文免费| 亚洲第一福利网站| 精品无人区太爽高潮在线播放| 亚洲福利视频久久| 欧美激情视频在线观看| 欧美精品在线网站| 欧美高清视频在线播放| 在线免费观看羞羞视频一区二区| 欧美超级乱淫片喷水| 国产欧美日韩精品在线观看| 国产美女精品视频| 日本道色综合久久影院| 欧美性猛交xxxx免费看久久久| 国产欧亚日韩视频| 欧美巨乳在线观看| 日韩亚洲精品电影| 亚洲国产另类 国产精品国产免费| 久久久国产精品视频| 国产精品视频一区二区高潮| 亚洲精品一区二区网址| 午夜精品免费视频| 中文字幕av一区二区| 亚洲综合最新在线| 91精品国产自产在线观看永久| 精品国内亚洲在观看18黄| 日韩激情视频在线| 日韩亚洲欧美中文高清在线| 亚洲第一网站男人都懂| 亚洲图中文字幕| 色狠狠av一区二区三区香蕉蜜桃| 少妇高潮 亚洲精品| 在线视频免费一区二区| 92国产精品久久久久首页| 亚洲色图偷窥自拍| 亚洲午夜色婷婷在线| 精品国产一区二区三区在线观看| 国产精品美女免费| 国产69精品久久久久99| 在线视频国产日韩| 亚洲专区国产精品| 91在线精品播放| 久久九九热免费视频| 中文字幕精品一区二区精品| 成人精品视频在线| 欧美精品久久久久久久久| 亚洲国产精品成人一区二区| 伊人伊成久久人综合网站| 中文国产亚洲喷潮| 成人444kkkk在线观看| www.日韩免费| 精品香蕉一区二区三区| 97国产一区二区精品久久呦| 欧美激情乱人伦| 国产综合在线看| 成人黄色片网站| 亚洲色图狂野欧美| 一区二区三区在线播放欧美| 色偷偷av一区二区三区乱| 亚洲精品网址在线观看| 一本色道久久综合狠狠躁篇的优点| 国产精品69精品一区二区三区| 日韩电视剧在线观看免费网站| 久久精品2019中文字幕| 亚洲精品99999| 成人免费看吃奶视频网站| 青青草原成人在线视频| 动漫精品一区二区| 91精品在线国产| 日韩电视剧在线观看免费网站| 亚洲欧美精品在线| 韩国视频理论视频久久| 久久人人爽国产| 欧美在线性视频| 欧美福利视频网站| 另类专区欧美制服同性| 欧美大秀在线观看| 国产精品爽爽爽爽爽爽在线观看| 国产精品久在线观看| 91久久久久久久久久久久久| 亚洲精品成a人在线观看|