vue 利用canvas做圖片壓縮上傳

文中的注釋 有助于更好的理解

HTML

<input @change="fileChange($event)" type="file" accept="image/*" > //上傳圖片類型
<div class="add">
                <input @change="fileChange($event)" type="file" accept="image/*" >
                <div class="add-image">
                    <div class="add-ico">
                        <img src="../../../static/info3.png" alt="">
                    </div>
                    <img class="add-img" v-show="imgL" :src="imgL" alt="">
                </div>
                <p class="font13">點(diǎn)擊上傳名片</p>
</div>

Methods

//判斷是否圖片類型
fileChange(el) {
           // console.log(el.target.files[0].size)
            if (!el.target.files[0].size){
                this.$msgbox("請(qǐng)選擇圖片文件")
                return
            }else{
                this.fileList(el.target);
                el.target.value = ''
            }
            
        },

//判斷是否為文件夾文件
fileList(fileList) {
              let files = fileList.files;
                //判斷是否為文件夾
                if (files.type != '') {
                    this.fileAdd(files);
                } else {
                    this.$msgbox("請(qǐng)選擇圖片文件")
                }
        },

fileAdd(file) {
            //判斷是否為圖片文件
            if (file.type.indexOf('image') == -1) {
                this.$msgbox("請(qǐng)選擇圖片文件")
            } else {
                let reader = new FileReader();
                let image = new Image();
                let _this = this;
                reader.readAsDataURL(file);
                reader.onload = function () {
                    file.src = this.result;
                    image.onload = function(){
                        let width = image.width;
                        let height = image.height;
                        file.width = width;
                        file.height = height;
                        _this.imgL = file.src  //頁面上顯示所選擇的圖片
                    };
                    console.log(file)
                    image.src= file.src; //頁面上顯示所選擇的圖片
                    if(file.size/1024 > 1025){  //判斷圖片的大小,超過1M 進(jìn)行壓縮
                        _this.imgCompress(file,{quality: 0.2})
                    }else{
                        _this.partitionBase = file.src.split(",")[1]  //這里是因?yàn)楹笈_(tái)需要 base64和圖片type類型兩個(gè)數(shù)據(jù),所以進(jìn)行了處理
                        _this.imgType ="."+file.type.split("/")[1]
                    }
                }
            }
        },

//圖片壓縮
        imgCompress(path,obj){   //path是指上傳的圖片,obj是壓縮的品質(zhì)昔榴,越低越模糊
            let _this = this  //這里的this 是把vue的實(shí)例對(duì)象指向改變?yōu)開this 
            var img = new Image();
            img.src = path.src;
            img.onload = function(){
                var that = this;  //這里的this 是把img的對(duì)象指向改變?yōu)閠hat 
                // 默認(rèn)按比例壓縮
                var w = that.width,
                    h = that.height,
                    scale = w / h;
                w = obj.width || w;
                h = obj.height || (w / scale);
                var quality = 0.7;  // 默認(rèn)圖片質(zhì)量為0.7
                //生成canvas
                var canvas = document.createElement('canvas');
                var ctx = canvas.getContext('2d');
                // 創(chuàng)建屬性節(jié)點(diǎn)
                var anw = document.createAttribute("width");
                anw.nodeValue = w;
                var anh = document.createAttribute("height");
                anh.nodeValue = h;
                canvas.setAttributeNode(anw);
                canvas.setAttributeNode(anh);
                ctx.drawImage(that, 0, 0, w, h);
                // 圖像質(zhì)量
                if(obj.quality && obj.quality <= 1 && obj.quality > 0){
                    quality = obj.quality;
                }
                // quality值越小,所繪制出的圖像越模糊
                var base64 = canvas.toDataURL('image/jpeg', quality);
                // 回調(diào)函數(shù)返回base64的值
                var urlFile = _this.convertBase64UrlToBlob(base64)  //這個(gè)地方的處理是為了把壓縮的base64轉(zhuǎn)化為對(duì)象碘橘,獲得壓縮后圖片的大小size互订,方便對(duì)壓縮后的圖片再次進(jìn)行判斷;
                console.log(urlFile)
                if(urlFile.size/1024 > 1025){
                    _this.$msgbox("圖片過大痘拆,請(qǐng)重新上傳圖片")
                }else{
                    _this.partitionBase = base64.split(",")[1]
                    _this.imgType ="."+urlFile.type.split("/")[1]
                }
            }
        },

//將base64碼轉(zhuǎn)化為file(Blob)
        //此處函數(shù)對(duì)壓縮后的base64經(jīng)過處理返回{size: "", type: ""} 
        convertBase64UrlToBlob(urlData){
            var arr = urlData.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 Blob([u8arr], {type:mime});
        },

至此仰禽,圖片就壓縮完成了
經(jīng)測(cè)試,2M的圖片错负,壓縮后的大小為20多K坟瓢。(圖片沒什么花里胡哨的東西)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末勇边,一起剝皮案震驚了整個(gè)濱河市犹撒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粒褒,老刑警劉巖识颊,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡祥款,警方通過查閱死者的電腦和手機(jī)清笨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刃跛,“玉大人抠艾,你說我怎么就攤上這事〗瓣迹” “怎么了检号?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蛙酪。 經(jīng)常有香客問我齐苛,道長(zhǎng),這世上最難降的妖魔是什么桂塞? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任凹蜂,我火速辦了婚禮,結(jié)果婚禮上阁危,老公的妹妹穿的比我還像新娘玛痊。我一直安慰自己,他們只是感情好狂打,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布卿啡。 她就那樣靜靜地躺著,像睡著了一般菱父。 火紅的嫁衣襯著肌膚如雪颈娜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天浙宜,我揣著相機(jī)與錄音官辽,去河邊找鬼。 笑死粟瞬,一個(gè)胖子當(dāng)著我的面吹牛同仆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播裙品,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼俗批,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了市怎?” 一聲冷哼從身側(cè)響起岁忘,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎区匠,沒想到半個(gè)月后干像,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年麻汰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了速客。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡五鲫,死狀恐怖溺职,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情位喂,我是刑警寧澤辅愿,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站忆某,受9級(jí)特大地震影響点待,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弃舒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一癞埠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧聋呢,春花似錦苗踪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至器贩,卻和暖如春颅夺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛹稍。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工吧黄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唆姐。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓拗慨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親奉芦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赵抢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 本文始發(fā)于我的博文App圖片壓縮裁剪原理和上傳方案烦却,以及那些有趣的事兒...,現(xiàn)轉(zhuǎn)發(fā)至此减噪。 目錄 App怎么壓縮質(zhì)...
    zackzheng閱讀 19,240評(píng)論 20 130
  • 1短绸、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,979評(píng)論 3 119
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,371評(píng)論 8 265
  • 這是多么理想的結(jié)局:有錢了,又找到了愛情筹裕,還走了很多路醋闭。 因?yàn)橛兄私馑谑澜绲膲?mèng)想,圣地亞哥決定去當(dāng)一個(gè)牧羊人...
    張展東閱讀 193評(píng)論 0 1
  • 想家 前夜朝卒,閨蜜發(fā)來消息“想家了”证逻,“每次坐公交就想家,真羨慕你不用坐公交”抗斤。想來也是因?yàn)榍羝螅阍谌ツ暝谏虾W鴰讉€(gè)小...
    時(shí)間的魔王閱讀 370評(píng)論 0 0