摘要:一介紹本文將介紹再項目中通過對圖片進行壓縮后使用。把圖片能轉(zhuǎn)換成出發(fā)事件對賦值完成,觸發(fā)事件生成,調(diào)用回調(diào)函數(shù)。將圖片將轉(zhuǎn)成格式把轉(zhuǎn)換成文件四壓縮完成使用五參考鏈接壓縮圖片到以下
一、介紹
本文將介紹再Vue項目中通過js對圖片進行壓縮后使用。(純前端實現(xiàn),不依賴后臺)
主要使用Canvas.toDataURL(type, encoderOptions)對圖片大小進行調(diào)整
參數(shù) | 描述 |
---|---|
type | 圖片格式 |
encoderOptions | 在指定圖片格式為 image/jpeg 或 image/webp的情況下,可以從 0 到 1 的區(qū)間內(nèi)選擇圖片的質(zhì)量。 |
使用 FileReader.readAsDataURL(file):該方法會讀取指定的 File 對象。讀取操作完成的時候,readyState 會變成已完成(DONE),并觸發(fā) loadend 事件,同時 result 屬性將包含一個data:URL格式的字符串(base64編碼)以表示所讀取文件的內(nèi)容。
reader.readAsDataURL 把圖片能轉(zhuǎn)換成 base64, 出發(fā) reader.onload 事件對 image.src 賦值完成,觸發(fā) image.onload 事件生成canvas,調(diào)用回調(diào)函數(shù)。
/** * 將圖片轉(zhuǎn)化為base64 */ imgBase64(file, callback) { // 看支持不支持FileReader if (!file || !window.FileReader) return; // 創(chuàng)建一個 Image 對象 let image = new Image(); // 綁定 load 事件處理器,加載完成后執(zhí)行 image.onload = function () { // 創(chuàng)建 canvas DOM 對象 let canvas = document.createElement("canvas"); // 返回一個用于在畫布上繪圖的環(huán)境, "2d" 指定了您想要在畫布上繪制的類型 let ctx = canvas.getContext("2d"); // 如果高度超標 // 參數(shù),最大高度 let MAX_HEIGHT = 3000; if (image.height > MAX_HEIGHT) { // 寬度等比例縮放 *= image.width *= MAX_HEIGHT / image.height; image.height = MAX_HEIGHT; } // 獲取 canvas的 2d 環(huán)境對象, ctx.clearRect(0, 0, canvas.width, canvas.height); // 重置canvas寬高 canvas.width = image.width; canvas.height = image.height; // 將圖像繪制到canvas上 ctx.drawImage(image, 0, 0, image.width, image.height); callback(image, canvas); }; if (/^image/.test(file.type)) { // 創(chuàng)建一個reader let reader = new FileReader(); // 讀取成功后的回調(diào) reader.onload = function () { // 設置src屬性,瀏覽器會自動加載。 // 記住必須先綁定事件,才能設置src屬性,否則會出同步問題。 image.src = this.result; }; // 將圖片將轉(zhuǎn)成 base64 格式 reader.readAsDataURL(file); } }2.把base64轉(zhuǎn)換成file文件
/** * 把base64轉(zhuǎn)換成file文件 */ convertBase64UrlToFile(dataurl, filename) { let arr = dataurl.split(","), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new File([u8arr], filename, {type: mime}); }3.ES6 Promise的簡單使用
function checkAndHandleCompression() { //當異步代碼執(zhí)行成功時,我們才會調(diào)用resolve(...), 當異步代碼失敗時就會調(diào)用reject(...) return new Promise((resolve, reject) => { resolve("成功!") // 代碼正常執(zhí)行! }) } checkAndHandleCompression().then((data)=>{ console.log(data) // print 成功! });4.對 Promise 填充代碼,檢查并壓縮圖片大小
如果圖片過大就使用Canvas.toDataURL(type, encoderOptions)對圖片進行壓縮,并將結(jié)果異步返回
/** * 檢查并壓縮圖片大小 */ checkAndHandleCompression(file) { return new Promise((resolve, reject) => { this.imgBase64(file, (image, canvas) => { let maxSize = 2 * 1024; // 壓縮到2M以下 (單位KB) let fileSize = file.size / 1024; // 圖片大小 (單位KB) let uploadSrc, uploadFile; // 如果圖片大小大于maxSize,進行壓縮 if (fileSize > maxSize) { uploadSrc = canvas.toDataURL(file.type, maxSize / fileSize); uploadFile = this.convertBase64UrlToFile(uploadSrc, file.name); // 轉(zhuǎn)成file文件 } else { uploadSrc = image.src; uploadFile = file; } let compressedSize = uploadFile.size / 1024;// 壓縮后圖片大小 (單位KB) // 判斷圖片大小是否小于maxSize,如果大于則繼續(xù)壓縮至小于為止 if (compressedSize.toFixed(2) > maxSize) { this.checkAndHandleCompression(uploadFile); } else { let fileOptions = {uploadSrc, uploadFile}; resolve(fileOptions); } }); }); }三、完整代碼
創(chuàng)建mixins/image-compress.js
export default { methods: { /** * 檢查并壓縮圖片大小 */ checkAndHandleCompression(file) { return new Promise((resolve, reject) => { this.imgBase64(file, (image, canvas) => { let maxSize = 2 * 1024; // 2M (單位KB) let fileSize = file.size / 1024; // 圖片大小 (單位KB) let uploadSrc, uploadFile; // 如果圖片大小大于maxSize,進行壓縮 if (fileSize > maxSize) { uploadSrc = canvas.toDataURL(file.type, maxSize / fileSize); // 轉(zhuǎn)換成DataURL uploadFile = this.convertBase64UrlToFile(uploadSrc, file.name); // 轉(zhuǎn)成file文件 } else { uploadSrc = image.src; uploadFile = file; } let compressedSize = uploadFile.size / 1024;// 壓縮后圖片大小 (單位KB) // 判斷圖片大小是否小于maxSize,如果大于則繼續(xù)壓縮至小于為止 if (compressedSize.toFixed(2) > maxSize) { this.checkAndHandleUpload(uploadFile); } else { let fileOptions = {uploadSrc, uploadFile}; resolve(fileOptions); } }); }); }, /** * 將圖片轉(zhuǎn)化為base64 */ imgBase64(file, callback) { // 看支持不支持FileReader if (!file || !window.FileReader) return; // 創(chuàng)建一個 Image 對象 let image = new Image(); // 綁定 load 事件處理器,加載完成后執(zhí)行 image.onload = function () { // 創(chuàng)建 canvas DOM 對象 let canvas = document.createElement("canvas"); // 返回一個用于在畫布上繪圖的環(huán)境, "2d" 指定了您想要在畫布上繪制的類型 let ctx = canvas.getContext("2d"); // 如果高度超標 // 參數(shù),最大高度 let MAX_HEIGHT = 3000; if (image.height > MAX_HEIGHT) { // 寬度等比例縮放 *= image.width *= MAX_HEIGHT / image.height; image.height = MAX_HEIGHT; } // 獲取 canvas的 2d 環(huán)境對象, // 可以理解Context是管理員,canvas是房子 ctx.clearRect(0, 0, canvas.width, canvas.height); // 重置canvas寬高 canvas.width = image.width; canvas.height = image.height; // 將圖像繪制到canvas上 ctx.drawImage(image, 0, 0, image.width, image.height); callback(image, canvas); }; if (/^image/.test(file.type)) { // 創(chuàng)建一個reader let reader = new FileReader(); // 讀取成功后的回調(diào) reader.onload = function () { // 設置src屬性,瀏覽器會自動加載。 // 記住必須先綁定事件,才能設置src屬性,否則會出同步問題。 image.src = this.result; }; // 將圖片將轉(zhuǎn)成 base64 格式 reader.readAsDataURL(file); } }, /** * 把Base64轉(zhuǎn)換成file文件 */ convertBase64UrlToFile(dataurl, filename) { let arr = dataurl.split(","), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new File([u8arr], filename, {type: mime}); } } };四、example
... ...五、參考鏈接
js壓縮圖片到2m以下
MDN web docs FileReader.readAsDataURL()
MDN web docs Promise
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93426.html
摘要:上一篇小程序開發(fā)第一篇注冊獲取同步企業(yè)項目數(shù)據(jù)微信小程序開發(fā)者工具下載小程序開發(fā)者工具使用小程序原生開發(fā)直接使用小程序開發(fā)者工具打開項目即可小程序框架開發(fā)首選官方提供類開發(fā)框架,備選。 上一篇:小程序開發(fā) 第一篇:注冊、獲取unionid同步企業(yè)項目數(shù)據(jù) 1.微信小程序開發(fā)者工具 下載:小程序開發(fā)者工具 使用: 小程序原生開發(fā):直接使用小程序開發(fā)者工具打開項目即可 小程序框架開發(fā):...
摘要:由于操作上比較多的設計都是隱性的例如滑動之類,需要手勢動畫作提示。如果頁面是推廣頁面,絕大部分用戶都是首次進入,而設計中的元素前端不能復現(xiàn)只能使用圖片時,會產(chǎn)生加載時間較長的問題。各手機尺寸,和比例。 先羅列一下我遇到的問題: 用戶可選擇圖片上傳,但是圖片比較大(基本都是2M以上),而且還得異步上傳。 由于操作上比較多的設計都是隱性的例如滑動之類,需要手勢動畫作提示。 塊內(nèi)元素滾動...
閱讀 1408·2021-10-14 09:43
閱讀 1003·2021-09-10 10:51
閱讀 1453·2021-09-01 10:42
閱讀 2199·2019-08-30 15:55
閱讀 593·2019-08-30 15:55
閱讀 2352·2019-08-30 14:21
閱讀 1724·2019-08-30 13:04
閱讀 3475·2019-08-29 13:09