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 圖片跨域問題)
場景一
將項目中的圖片資源轉(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)文章
玩轉(zhuǎn)JavaScript函數(shù):apply/call/bind技巧
歡迎來到這篇關(guān)于JavaScript中apply、call、bind函數(shù)的指南,這里充滿了實(shí)用技巧和深入理解,讓你的編程之旅更加游刃有余,趕快翻開這個神秘的“魔法書”,讓我們一起探索吧!2024-01-01
Electron實(shí)現(xiàn)自定義全量更新的詳細(xì)教程
本文主要介紹如何手動實(shí)現(xiàn)客戶端應(yīng)用的自動全量更新,通過改造electron-updater實(shí)現(xiàn)版本,系統(tǒng)等字段的動態(tài)判斷更新,實(shí)現(xiàn)后臺配置不同設(shè)備,版本,系統(tǒng)的版本更新,可自行在后臺配置定向更新,批量更新等,需要的朋友可以參考下2025-08-08
使用HTML+JavaScript實(shí)現(xiàn)SQL智能補(bǔ)全功能
現(xiàn)代數(shù)據(jù)庫管理工具中,SQL 智能補(bǔ)全功能已成為提升開發(fā)效率的重要特性,它能夠根據(jù)上下文環(huán)境自動提示關(guān)鍵詞、表名、字段名等信息,大大減少了手動輸入錯誤和查詢文檔的時間,本文將介紹如何使用HTML、CSS和JavaScript實(shí)現(xiàn)SQL智能補(bǔ)全功能,需要的朋友可以參考下2026-03-03
javascript觸發(fā)模擬鼠標(biāo)點(diǎn)擊事件
這篇文章主要介紹了javascript觸發(fā)模擬鼠標(biāo)點(diǎn)擊事件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-06-06
MutationObserver監(jiān)視對DOM?樹所做更改的功能妙用
這篇文章主要為大家介紹了MutationObserver監(jiān)視對DOM?樹所做更改的功能妙用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

