国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

基于canvas的圖片壓縮函數(shù)實(shí)現(xiàn)

neuSnail / 968人閱讀

摘要:由于圖片壓縮中使用了大量異步操作,這里使用語(yǔ)法處理異步問題基本思路是先將數(shù)據(jù)讀取為類型的數(shù)據(jù),再將繪制到,通過的轉(zhuǎn)換為數(shù)據(jù)并壓縮數(shù)據(jù),最后再將數(shù)據(jù)轉(zhuǎn)換為數(shù)據(jù)類型,再上傳到服務(wù)器。下面是具體的實(shí)現(xiàn)方式。

由于圖片壓縮中使用了大量異步操作,這里使用es7 async 語(yǔ)法處理異步問題
基本思路是:先將file數(shù)據(jù)讀取為DataUrl類型的數(shù)據(jù),再將DataUrl繪制到canvas,
通過canvas的apitoDataURL轉(zhuǎn)換為base64數(shù)據(jù)并壓縮數(shù)據(jù),最后再將base64數(shù)據(jù)轉(zhuǎn)換
為blob數(shù)據(jù)類型,再上傳到服務(wù)器。整個(gè)流程就完成了。下面是具體的實(shí)現(xiàn)方式。
1.讀取file轉(zhuǎn)換為DataUrl
async function fileLoad(file){
        return new Promise((resolve)=>{
            let ready = new FileReader();
            /*開始讀取指定的Blob對(duì)象或File對(duì)象中的內(nèi)容. 當(dāng)讀取操作完成時(shí),
            readyState屬性的值會(huì)成為DONE,如果設(shè)置了onloadend事件處理程序,
            則調(diào)用之.同時(shí),result屬性中將包含一個(gè)data: URL格式的字符串以表
            示所讀取文件的內(nèi)容.*/
            ready.readAsDataURL(file);
            ready.onload = function () {
                resolve(this.result);
            }
        })
    }
2.將數(shù)據(jù)繪制到canvas上,壓縮數(shù)據(jù)
async function canvasDataURL(path, obj) {
        return new Promise((resolve)=>{
            let img = new Image();
            img.src = path;
            img.onload = function () {
                let that = this;
                // 默認(rèn)按比例壓縮
                let w = that.width,
                    h = that.height,
                    scale = w / h;
                w = obj.width || w;
                h = obj.height || (w / scale);
                let quality = 0.7;  // 默認(rèn)圖片質(zhì)量為0.7
                //生成canvas
                let canvas = document.createElement("canvas");
                let ctx = canvas.getContext("2d");
                // 創(chuàng)建屬性節(jié)點(diǎn)
                let anw = document.createAttribute("width");
                anw.nodeValue = w;
                let 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值越小,所繪制出的圖像越模糊
                let base64 = canvas.toDataURL("image/jpeg", quality);
                // 回調(diào)函數(shù)返回base64的值
                resolve(base64);
            }
        });
    }
3.將bas64轉(zhuǎn)換為blob
async function convertBase64UrlToBlob(urlData) {
        return new Promise((resolve)=>{
            let 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);
            }
            let blob = new Blob([u8arr], {type: mime});
            resolve(blob);
        })
    }
4.最后實(shí)現(xiàn)壓縮方法
/**
     * 三個(gè)參數(shù)
     * file:一個(gè)是文件(類型是圖片格式),
     * w:配置對(duì)象
     * photoCompress()
     */
async function photoCompress(file, w) {
        let re = await fileLoad(file);
        let base64 = await canvasDataURL(re, w);
        let blob = await convertBase64UrlToBlob(base64);
        return new Promise((resolve)=>{
            resolve(blob);
        })
}
5.使用方法
async function upload(file) {
    let form = new FormData();
    let fileData = await photoCompress(file, {
        quality: 0.5
  });
 form.append("pictrue",fileData,file.name);
 // 上傳form
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/101715.html

相關(guān)文章

  • 基于 vue-upload-component 封裝一個(gè)圖片上傳組件

    摘要:預(yù)覽因?yàn)轫?xiàng)目是基于做的,本身就提供了的預(yù)覽組件,使用起來也簡(jiǎn)單,如果業(yè)務(wù)需求需要放大縮小,這個(gè)組件就不滿足了。 需求分析 業(yè)務(wù)要求,需要一個(gè)圖片上傳控件,需滿足 多圖上傳 點(diǎn)擊預(yù)覽 圖片前端壓縮 支持初始化數(shù)據(jù) 相關(guān)功能及資源分析 基本功能先到https://www.npmjs.com/search?q=vue+upload上搜索有關(guān)上傳的控件,沒有完全滿足需求的組件,過濾后找到...

    wangbjun 評(píng)論0 收藏0
  • vue下實(shí)現(xiàn)input實(shí)現(xiàn)圖片上傳,壓縮,拼接以及旋轉(zhuǎn)

    摘要:背景作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時(shí)候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個(gè)問題的時(shí)候,都會(huì)虎軀一震,以為會(huì)是一個(gè)棘手的問題,當(dāng)你讀完這篇文章的時(shí)候,你會(huì)發(fā)現(xiàn)都是你瞎操作了,真相就是這么簡(jiǎn)單 背景 作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時(shí)候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個(gè)問題的時(shí)候,都會(huì)虎...

    megatron 評(píng)論0 收藏0
  • vue下實(shí)現(xiàn)input實(shí)現(xiàn)圖片上傳,壓縮,拼接以及旋轉(zhuǎn)

    摘要:背景作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時(shí)候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個(gè)問題的時(shí)候,都會(huì)虎軀一震,以為會(huì)是一個(gè)棘手的問題,當(dāng)你讀完這篇文章的時(shí)候,你會(huì)發(fā)現(xiàn)都是你瞎操作了,真相就是這么簡(jiǎn)單 背景 作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時(shí)候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個(gè)問題的時(shí)候,都會(huì)虎...

    Invoker 評(píng)論0 收藏0
  • vue下實(shí)現(xiàn)input實(shí)現(xiàn)圖片上傳,壓縮,拼接以及旋轉(zhuǎn)

    摘要:背景作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時(shí)候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個(gè)問題的時(shí)候,都會(huì)虎軀一震,以為會(huì)是一個(gè)棘手的問題,當(dāng)你讀完這篇文章的時(shí)候,你會(huì)發(fā)現(xiàn)都是你瞎操作了,真相就是這么簡(jiǎn)單 背景 作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時(shí)候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個(gè)問題的時(shí)候,都會(huì)虎...

    ChristmasBoy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<