Vue使用mixins實(shí)現(xiàn)壓縮圖片代碼
本文介紹了Vue使用mixins實(shí)現(xiàn)壓縮圖片代碼,分享給大家,具體如下:
圖片壓縮
創(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;
if (fileSize > maxSize) { // 如果圖片大小大于maxSize,進(jìn)行壓縮
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.checkAndHandleUpload(uploadFile);
} else {
let fileOptions = {uploadSrc, uploadFile};
resolve(fileOptions);
}
});
});
},
/**
* 將圖片轉(zhuǎn)化為base64
*/
imgBase64(file, callback) {
// 看支持不支持FileReader
if (!file || !window.FileReader) return;
// 創(chuàng)建一個(gè) Image 對(duì)象
let image = new Image();
// 綁定 load 事件處理器,加載完成后執(zhí)行
image.onload = function () {
// 創(chuàng)建 canvas DOM 對(duì)象
let canvas = document.createElement('canvas');
// 返回一個(gè)用于在畫布上繪圖的環(huán)境, '2d' 指定了您想要在畫布上繪制的類型
let ctx = canvas.getContext('2d');
// 如果高度超標(biāo) // 參數(shù),最大高度
let MAX_HEIGHT = 3000;
if (image.height > MAX_HEIGHT) {
// 寬度等比例縮放 *=
image.width *= MAX_HEIGHT / image.height;
image.height = MAX_HEIGHT;
}
// 獲取 canvas的 2d 環(huán)境對(duì)象,
// 可以理解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)建一個(gè)reader
let reader = new FileReader();
// 將圖片將轉(zhuǎn)成 base64 格式
reader.readAsDataURL(file);
// 讀取成功后的回調(diào)
reader.onload = function () {
// 設(shè)置src屬性,瀏覽器會(huì)自動(dòng)加載。
// 記住必須先綁定事件,才能設(shè)置src屬性,否則會(huì)出同步問題。
image.src = this.result;
};
}
},
/**
* 把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
<template> ... </template> <script> import imageUploadMixins from '@/mixins/image-compress'; export default { mixins: [imageUploadMixins], ... methods:{ handleUploadImage(e){ let file = e.target.files[0]; this.checkAndHandleCompression(file).then( fileOptions => { // let {uploadSrc, uploadFile} = fileOptions; // 壓縮完成使用 uploadSrc, uploadFile ... }); } } ... } </script> <style> ... </style>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue3.0 響應(yīng)式系統(tǒng)源碼逐行分析講解
這篇文章主要介紹了Vue3.0 響應(yīng)式系統(tǒng)源碼逐行分析講解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
vuecli3打包后出現(xiàn)跨域問題,前端配置攔截器無效的解決
這篇文章主要介紹了vuecli3打包后出現(xiàn)跨域問題,前端配置攔截器無效的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
tomcat部署前端vue項(xiàng)目步驟(項(xiàng)目上線具體操作)
在實(shí)際開發(fā)中,我們經(jīng)常會(huì)遇到將Vue項(xiàng)目部署到Tomcat服務(wù)器上的需求,下面這篇文章主要給大家介紹了關(guān)于tomcat部署前端vue項(xiàng)目(項(xiàng)目上線具體操作)的相關(guān)資料,需要的朋友可以參考下2024-07-07
詳解vue-cli項(xiàng)目在IE瀏覽器打開報(bào)錯(cuò)解決方法
這篇文章主要介紹了詳解vue-cli項(xiàng)目在IE瀏覽器打開報(bào)錯(cuò)解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
vue 動(dòng)態(tài)改變靜態(tài)圖片以及請(qǐng)求網(wǎng)絡(luò)圖片的實(shí)現(xiàn)方法
下面小編就為大家分享一篇vue 動(dòng)態(tài)改變靜態(tài)圖片以及請(qǐng)求網(wǎng)絡(luò)圖片的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02
基于Vue和Firebase實(shí)現(xiàn)一個(gè)實(shí)時(shí)聊天應(yīng)用
在本文中,我們將學(xué)習(xí)如何使用Vue.js和Firebase來構(gòu)建一個(gè)實(shí)時(shí)聊天應(yīng)用,Vue.js是一種流行的JavaScript前端框架,而Firebase是Google提供的實(shí)時(shí)數(shù)據(jù)庫(kù)和后端服務(wù),結(jié)合這兩者,我們可以快速搭建一個(gè)功能強(qiáng)大的實(shí)時(shí)聊天應(yīng)用,需要的朋友可以參考下2023-08-08
vue3?element?plus?table?selection展示數(shù)據(jù),默認(rèn)選中功能方式
這篇文章主要介紹了vue3?element?plus?table?selection展示數(shù)據(jù),默認(rèn)選中功能方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

