91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

html5中怎么解決canvas圖片跨域問題

發布時間:2022-02-21 09:57:48 來源:億速云 閱讀:787 作者:iii 欄目:開發技術

這篇文章主要介紹“html5中怎么解決canvas圖片跨域問題”,在日常操作中,相信很多人在html5中怎么解決canvas圖片跨域問題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”html5中怎么解決canvas圖片跨域問題”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

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

html5中怎么解決canvas圖片跨域問題

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'

html5中怎么解決canvas圖片跨域問題

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

crossOrigin兼容性

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

html5中怎么解決canvas圖片跨域問題

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

到此,關于“html5中怎么解決canvas圖片跨域問題”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

屏东市| 肥西县| 沙河市| 萨嘎县| 翼城县| 宜兰市| 巴里| 五常市| 永定县| 百色市| 进贤县| 平阳县| 杂多县| 岳阳市| 肥西县| 株洲市| 陈巴尔虎旗| 页游| 武城县| 绥阳县| 柳林县| 新沂市| 昭苏县| 辉南县| 揭阳市| 乐都县| 姜堰市| 娄烦县| 唐河县| 遂平县| 浦城县| 金华市| 顺平县| 库尔勒市| 东乌| 沂南县| 武清区| 滕州市| 明星| 韶关市| 高平市|