JavaScript toDataURL圖片轉(zhuǎn)換問題解讀
JavaScript toDataURL圖片轉(zhuǎn)換
問題
js業(yè)務(wù)中涉及到圖片轉(zhuǎn)換格式,.在安卓手機(jī)的微信瀏覽器上出現(xiàn)
stack: "Error: Failed to execute ‘toDataURL’ on ‘HTMLCanvasElement’: Tainted canvases may not be exported
最初解決方法(在安卓的微信瀏覽器上有問題)
??? ?let image = new Image(); ??? ?image.src = img; ? ? image.setAttribute('crossOrigin', 'anonymous');
最開始使用的這個方法。是將跨域?qū)傩栽O(shè)置為anonymous,然后服務(wù)器的nginx端也添加跨域header=*
但測試時會卡住
最終解決方法
??? ?let image = new Image(); ??? ?image.setAttribute('crossOrigin', 'anonymous'); ??? ?image.src = img;
調(diào)試了很久發(fā)現(xiàn)將屬性設(shè)置放在圖片的賦值前面就解決問題了
js將圖片轉(zhuǎn)為base64(解決Canvas.toDataURL 圖片跨域問題)
場景一
將項(xiàng)目中的圖片資源轉(zhuǎn)為base64
function convertImgToBase64(url, callback) { ? ? ? ? let canvas = document.createElement('canvas'), ? ? ? ? ctx = canvas.getContext('2d'), ? ? ? ? img = new Image(); ? ? ? ? img.crossOrigin = 'anonymous';//解決Canvas.toDataURL 圖片跨域問題 ? ? ? ? img.onload = () => { ? ? ? ? ? canvas.height = img.height; ? ? ? ? ? canvas.width = img.width; ? ? ? ? ? ctx.drawImage(img, 0, 0, canvas.width, canvas.height); ? ? ? ? ? let ext = img.src.substring(img.src.lastIndexOf(".") + 1).toLowerCase(); // 獲取到圖片的格式 ? ? ? ? ? let dataURL = canvas.toDataURL("image/" + ext); // 得到base64 編碼的 dataURL ? ? ? ? ? callback && callback(dataURL); ? ? ? ? ? canvas = null; ? ? ? ? }; ? ? ? ? img.src = url; ? ? ? } var ?baseUrl = '' convertImgToBase64(this.options.logo, (baseUrl) => { ? ? baseUrl = baseUrl })
場景二
將用戶本地上傳的資源轉(zhuǎn)化,即用戶通過瀏覽器點(diǎn)擊文件上傳時,將圖片資源轉(zhuǎn)化成base64:
<!DOCTYPE html> <html> <head> ? <meta charset="utf-8"> ? <meta name="viewport" content="width=device-width,initial-scale=1.0"> ? <style> ? </style> </head> <body> ? <p><input type="file" id="upfile"></p> ? <p><button id="upJS">用原生JS上傳</button> ? </div> ? <script> ? ? function imgFileTobase64() { ? ? ? var reader = new FileReader(); ? ? ? var AllowImgFileSize = 2100000; //上傳圖片最大值(單位字節(jié))( 2 M = 2097152 B )超過2M上傳失敗 ? ? ? var file = document.getElementById('upfile').files[0] ? ? ? if (file) { ? ? ? ? //將文件以Data URL形式讀入頁面 ? ? ? ? reader.readAsDataURL(file); ? ? ? ? reader.onload = function (e) { ? ? ? ? ? //var ImgFileSize = reader.result.substring(reader.result.indexOf(",") + 1).length;//截取base64碼部分(可選可不選,需要與后臺溝通) ? ? ? ? ? if (AllowImgFileSize != 0 && AllowImgFileSize < reader.result.length) { ? ? ? ? ? ? alert('上傳失敗,請上傳不大于2M的圖片!'); ? ? ? ? ? ? return; ? ? ? ? ? } else { ? ? ? ? ? ? //執(zhí)行上傳操作 ? ? ? ? ? ? alert(reader.result); ? ? ? ? ? } ? ? ? ? } ? ? ? } ? ? } ? ? document.getElementById("upJS").onclick = function () { ? ? ? imgFileTobase64() ? ? } ? </script> </body> </html>
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript Array實(shí)例方法flat的實(shí)現(xiàn)
flat() 方法用于將一個嵌套多層的數(shù)組進(jìn)行扁平,返回新數(shù)組,它不會改變原始數(shù)組, flat 方法在處理多維數(shù)組時非常有用,它可以讓數(shù)組操作變得更加靈活和簡潔,本文給大家介紹了JavaScript Array實(shí)例方法flat的實(shí)現(xiàn),需要的朋友可以參考下2024-03-03JavaScript setTimeout和setInterval的使用方法 說明
兩個函數(shù)都是可以用來實(shí)現(xiàn)一段時間后執(zhí)行一段javascript代碼的效果。兩個函數(shù)都有兩個參數(shù),前面的都是執(zhí)行表達(dá)式,后面的是隔的秒數(shù)。2010-03-03JavaScript面向?qū)ο缶幊虒?shí)現(xiàn)模擬
面向?qū)ο缶幊?Object Oriented Programming)將現(xiàn)實(shí)世界中的復(fù)雜關(guān)系抽象成一個個對象,通過對象之間的分工合作對現(xiàn)實(shí)世界進(jìn)行模擬2022-10-10Javascript 多瀏覽器兼容總結(jié)(實(shí)戰(zhàn)經(jīng)驗(yàn))
多瀏覽器兼容一直都是前端備受關(guān)注的問題,本文整理了一些實(shí)戰(zhàn)的經(jīng)驗(yàn),個人感覺還不錯,需要的朋友可以參考下2013-10-10微信小程序授權(quán)登錄實(shí)現(xiàn)方案wx.getUserProfile(2022年最新版)
微信在最近開始要求使用wx.getUserProfile()來獲取用戶的昵稱,頭像等信息,所以下面這篇文章主要給大家介紹了關(guān)于2022年最新版微信小程序授權(quán)登錄實(shí)現(xiàn)方案wx.getUserProfile的相關(guān)資料,需要的朋友可以參考下2022-11-11基于JavaScript實(shí)現(xiàn)快速轉(zhuǎn)換文本語言(繁體中文和簡體中文)
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)快速切換正體中文和簡體中文,需要的朋友可以參考下2016-03-03微信小程序開發(fā)之?dāng)?shù)據(jù)存儲 參數(shù)傳遞 數(shù)據(jù)緩存
本文主要介紹了微信小程序開發(fā)之?dāng)?shù)據(jù)存儲、參數(shù)傳遞、數(shù)據(jù)緩存的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧2017-04-04