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

首頁 > 編程 > HTML > 正文

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

2024-08-26 00:21:01
字體:
來源:轉載
供稿:網友

一、首先,圖片服務器需要配置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.

canvas,圖片,getImageData,toDataURL,跨域

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'

canvas,圖片,getImageData,toDataURL,跨域

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

crossOrigin兼容性

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

canvas,圖片,getImageData,toDataURL,跨域

四、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尺寸限制。

六、結束語

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


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产一区av| 国产精品久久999| 美女撒尿一区二区三区| 欧美丰满老妇厨房牲生活| 久久国产精品久久久| 欧美高清在线观看| 欧美在线激情视频| 在线精品视频视频中文字幕| 国产69精品久久久久9999| 中文字幕久精品免费视频| 中文字幕亚洲激情| 性金发美女69hd大尺寸| 亚洲欧洲激情在线| 国产97在线亚洲| 国产99久久久欧美黑人| 欧美精品18videosex性欧美| 操人视频在线观看欧美| 视频在线观看99| 色av吧综合网| 日韩精品中文字幕在线观看| 韩国三级电影久久久久久| 亚洲精品中文字幕av| 国产成人亚洲综合91| 日本不卡视频在线播放| 欧美极品少妇xxxxx| 中文字幕精品在线| 国产一级揄自揄精品视频| 亚洲欧美日韩另类| 国产精品一区二区三区免费视频| 岛国视频午夜一区免费在线观看| 日韩欧美视频一区二区三区| 亚洲综合视频1区| 国产日韩在线播放| 国产精品一区二区性色av| 久久激情视频久久| 国产97在线|亚洲| 5566成人精品视频免费| 成人激情视频网| 久久精品国产精品亚洲| 91久久在线观看| 伊人亚洲福利一区二区三区| 日韩视频免费看| 国产精品美女999| 亚洲欧美国产精品专区久久| 国产日韩欧美日韩大片| 国产精品99久久久久久久久久久久| 国产精品女人久久久久久| www.亚洲人.com| 欧美电影《睫毛膏》| 久久国产精品久久国产精品| 一区二区三区回区在观看免费视频| 欧美亚洲第一区| 成人xxxx视频| 欧美亚洲国产日本| 欧美日韩一区二区免费在线观看| 国产亚洲成av人片在线观看桃| 亚洲国产精品yw在线观看| 国产成人综合久久| 国产小视频国产精品| 欧美视频一区二区三区…| 7777精品久久久久久| 欧美性极品xxxx做受| 亚洲福利在线观看| 久久99久久99精品免观看粉嫩| 欧美国产日韩中文字幕在线| 国产在线视频91| 久久久女人电视剧免费播放下载| 亚洲国产精久久久久久久| 国产精品久久久久久影视| 欧美日韩国产精品| 国产亚洲精品久久久| 国产婷婷成人久久av免费高清| 国产综合福利在线| 黑人巨大精品欧美一区二区一视频| 最近2019年日本中文免费字幕| 亚洲图中文字幕| 亚洲精品综合精品自拍| 午夜精品久久久久久久久久久久久| 欧美乱人伦中文字幕在线| 成人免费直播live| 欧美激情喷水视频| 97在线视频免费观看| 亚洲成av人片在线观看香蕉| 久久久噜久噜久久综合| 久久久久国产精品免费| 国产精品av网站| 亚洲无线码在线一区观看| 久久成人18免费网站| 日韩中文字在线| 成人xxxxx| 欧美成年人在线观看| 青青a在线精品免费观看| 九九久久久久99精品| 亚洲最大的成人网| 国产精品激情av在线播放| 久久精品免费电影| 在线观看中文字幕亚洲| 亚洲精品久久久一区二区三区| 亚洲自拍另类欧美丝袜| 日韩电影大片中文字幕| 日韩黄色在线免费观看| 亚洲欧洲日产国码av系列天堂| 色婷婷亚洲mv天堂mv在影片| www.xxxx欧美| 欧美香蕉大胸在线视频观看| 91精品国产色综合久久不卡98口| 琪琪第一精品导航| 亚洲成年人在线| 韩曰欧美视频免费观看| 在线观看视频亚洲| 久久久久久久久电影| 国产亚洲精品日韩| 精品国产鲁一鲁一区二区张丽| 亚洲美女免费精品视频在线观看| 久久久精品欧美| 成人免费淫片aa视频免费| 国内自拍欧美激情| 国产91精品黑色丝袜高跟鞋| 久久午夜a级毛片| 中文字幕精品久久久久| …久久精品99久久香蕉国产| 日韩美女毛茸茸| 亚洲女人天堂av| 高清欧美性猛交xxxx黑人猛交| 91久久精品久久国产性色也91| 欧美精品18videosex性欧美| 国产亚洲视频中文字幕视频| 欧美激情精品久久久久| 国产精品久久久久久一区二区| 欧美亚洲另类激情另类| 久久久久这里只有精品| 久久精品一偷一偷国产| 亚洲第一天堂无码专区| 亚洲一品av免费观看| 日韩欧美黄色动漫| 精品久久香蕉国产线看观看gif| 国产精品999| 日韩美女中文字幕| 久久香蕉国产线看观看网| 美女视频黄免费的亚洲男人天堂| 亚洲成人网久久久| 亚洲全黄一级网站| 原创国产精品91| 国a精品视频大全| 神马久久桃色视频| 91超碰caoporn97人人| 久久久视频免费观看| 在线播放亚洲激情| 国产成人aa精品一区在线播放| 亚洲人成电影在线播放| 日韩精品在线视频美女| 国产精品黄色影片导航在线观看| 黑人狂躁日本妞一区二区三区| 国产精品久久久久秋霞鲁丝| 欧美极品美女电影一区| 国产成人精彩在线视频九色| 国产精品视频不卡| 国产精品欧美日韩一区二区| 精品久久久国产| 久久夜精品香蕉| 亚洲护士老师的毛茸茸最新章节| 国产成人高清激情视频在线观看| 亚洲人成电影网站色…| 26uuu亚洲伊人春色|