全網唯一的純前端實現的canvas支援多圖壓縮並打包下載的工具

肖秋雄發表於2019-07-02

技術棧:

canvas

jszip.js(網頁端壓縮解壓縮外掛JSZIP庫)

FileSaver.js(檔案儲存到本地庫)

直接解讀原始碼:

<div class="cont">
        <div class="uploadBtn">選擇圖片<input name="file" accept="image/png, image/jpeg" multiple type="file" id="file"></div>
        <br>
        <br>
        <div class="selectbox">
            <div>請選擇壓縮質量</div>
            <select id="encoderOptions">
                <option value="0.1">10%</option>
                <option value="0.2">20%</option>
                <option value="0.3">30%</option>
                <option value="0.4">40%</option>
                <option value="0.5" selected>50%</option>
                <option value="0.6">60%</option>
                <option value="0.7">70%</option>
                <option value="0.8">80%</option>
                <option value="0.9">90%</option>
                <option value="1">100%</option>
            </select>
        </div>
        <br>
        <div id="show">
            <br>
            <br>
            需要壓縮的圖片:
            <br>
            <br>
            <ul id="selectView"></ul>
            <br>
        </div>
        <div id="compressBox">
            <button id="active" onclick="startCompress()">壓縮圖片並下載</button>
        </div>
    </div>
    <canvas id="canvas"></canvas>

  js部分:

<!-- 網頁端壓縮解壓縮外掛JSZIP庫 -->
    <script src="jszip.min.js"></script>
    <!-- 檔案儲存到本地庫 -->
    <script src="FileSaver.js"></script>
    <!--用於檔案下載-->
    <script>
    // 圖片質量(0-1)
    var encoderOptions = 0.5;
    // 獲取input
    var filesInput = document.querySelector('#file')
    // 獲取壓縮按鈕
    var compressBox = document.querySelector('#compressBox')
    // 選擇圖片展示視口
    var selectView = document.querySelector('#selectView')
    // 獲取選擇圖片後展示的視口
    var show = document.querySelector('#show')
    var encoderOptionInput = document.querySelector('#encoderOptions')
    // 所有的選擇檔案
    var files;
    var canvas;
    var ctx;
    // new JSZip物件
    var zip = new JSZip();
    // 建立images資料夾,用來存在壓縮完成的圖片
    var imgFolder = zip.folder("images");
    // 監聽input選擇檔案的變化
    filesInput.onchange = function() {
        // 獲取所有file
        files = filesInput.files
        // 如果選擇files數量大於0就顯示壓縮操作
        if (files.length > 0) {
            show.style.display = 'block'
            compressBox.style.display = 'block'
        }
        // 拼接縮圖列表
        var html = ''
        for (var i = 0; i < files.length; i++) {
            html += '<li><img width="60" height="60" src="' + getObjectURL(files[i]) + '" alt="" /></li>'
        }
        // 插入拼接的圖片列表
        selectView.innerHTML = html
    }
    // 壓縮圖片的方法
    function startCompress() {
        demo(files[0], 0)
    }
    // 利用遞迴迴圈files
    function demo(file, num) {

        if (num <= files.length - 1) {
            encoderOptions = parseFloat(encoderOptionInput.value)
            // 獲取file的base64地址
            var imgsrc = getObjectURL(file)
            // 獲取檔名稱
            var name = file.name
            // 監聽如果轉換base64地址成功,就執行下面的
            if (imgsrc) {
                // 建立image,並動態複製src
                var img = new Image()
                img.src = imgsrc
                // 監聽img圖片載入完成
                img.onload = () => {
                    // 獲取canvas標籤
                    canvas = document.querySelector('#canvas')
                    // 獲取上下文
                    ctx = canvas.getContext('2d')
                    // 根據圖片寬高設定canvas的寬高
                    canvas.width = img.width
                    canvas.height = img.height
                    // 在canvas上面畫圖片
                    ctx.drawImage(img, 0, 0, img.width, img.height);
                    // 把canvas轉成路徑
                    // canvas.toDataURL(type, encoderOptions);
                    // 引數
                    // type 可選
                    // 圖片格式, 預設為image / png
                    // encoderOptions 可選
                    // 圖片質量。 取值範圍為0到1。 如果指定圖片格式為image / jpeg或image / webp。 如果超出取值範圍, 將會使用預設值0 .92。 其他引數會被忽略。
                    var typeTxt = 'image/jpeg'
                    if (name.indexOf('png') != -1) {
                        typeTxt = 'image/png'
                    }
                    var imgdata = canvas.toDataURL(typeTxt, encoderOptions)
                    // 分割base64
                    imgdata = imgdata.split(',')
                    // 新增圖片到資料夾
                    imgFolder.file(name, imgdata[1], { base64: true });
                    // 如果當前的標記和檔案的數量相等的話,就說明壓縮新增到檔案到資料夾已經完成了,可以壓縮下載了。
                    if (num == files.length - 1) {
                        zip.generateAsync({ type: "blob" })
                            .then(function(content) {
                                // 建立的zip的檔名稱是images
                                saveAs(content, "images.zip");
                                location.reload()
                            });
                    } else {
                        // 如果沒有到標記,就繼續回撥
                        num++
                        demo(files[num], num)
                    }
                }
            }
        }
    }
    // 獲取file 的base64路徑
    function getObjectURL(file) {
        var url = null;
        if (window.createObjectURL != undefined) {
            url = window.createObjectURL(file);
        } else if (window.URL != undefined) { // mozilla(firefox)  
            url = window.URL.createObjectURL(file);
        } else if (window.webkitURL != undefined) { // webkit or chrome  
            url = window.webkitURL.createObjectURL(file);
        }
        return url;
    }
    </script>

  css部分:

<style>
        *{
    		padding: 0;
    		margin: 0;
    		background-color: #000;
    		color: #DC143C;
    		-webkit-touch-callout: none;
					-webkit-user-select: none;
					-khtml-user-select: none;
					-moz-user-select: none;
					user-select: none;
    	}
      html,body{
    		overflow: hidden;
    		padding: 20px;
    		box-sizing: border-box;
    	}
    	h3{
    		text-align: center;
    	}
      #compressBox{
    		display: none;
    	}
    	#canvas{
    		position: fixed;
    		top: -100000px;
    		left: -100000px;
    		opacity: 0;
    	}
    	.cont{
    		margin-top: 20px;
    		padding: 20px;
    		box-sizing: border-box;
    		border: 1px solid #DC143C;
    		border-radius: 10px;
    		background-color: #fff;
    		font-size: 13px;
    		min-height: 80px;
    	}
    	.uploadBtn{
				position: relative;
				display: inline-block;
				padding: 0 20px;
				line-height: 28px;
				background-color: #fff;
				border: 1px solid #DC143C;
				font-size: 12px;
				border-radius: 30px;
				text-align: center;
				cursor: pointer;
				width: 300px;
    	}
    	.uploadBtn input{
    		opacity: 0;
    		position: absolute;
    		top: 0;
    		left: 0;
    		width: 100%;
    		height: 100%;
    		cursor: pointer;
    	}
    	#selectView{
    		background-color: #fff;
    	}
    	#selectView li{
    		background-color: #fff;
    		display: inline-block;
    		margin-right: 10px;
    	}
    	#compressBox{
    		height: 60px;
    		background-color: #fff;
    	}
    	#active{
    		position: absolute;
				left: 50%;
				transform: translateX(-50%);
				display: block;
				padding: 0 20px;
				line-height: 28px;
				background-color: #DC143C;
				border: 1px solid #DC143C;
				font-size: 12px;
				border-radius: 30px;
				text-align: center;
				cursor: pointer;
				width: 300px;
				color: #fff;
    	}
    	#show{
    		display: none;
    		background-color: #fff;
    	}
    	.help{
    		position: fixed;
    		font-size: 12px;
    		bottom: 20px;
    		left: 0;
    		text-align: center;	
    		width: 100%;
    	}
    	.selectbox{
    		background-color: #fff;
    		display: -webkit-flex;
    		display: -moz-flex;
    		display: -ms-flex;
    		display: -o-flex;
    		display: flex;
    	}
    	.selectbox input,.selectbox div,.selectbox select{
    		background-color: #fff;
    	}
    	.selectbox div{
    		padding-right: 20px;
    	}
    </style>

  

解讀:

1、以上的工具,暫時只是配置了允許png和jpg格式的圖片壓縮,如需別的格式的請自行到我的github上面clone下載自行修改;

2、壓縮質量:10份;

3、壓縮會自動打包成zip,自行下載解壓,壓縮速度驚人。,

4、壓縮速度我覺得比熊貓壓縮牛逼。

使用方法:

github: https://github.com/xiaoqiuxiong/imageCompressionTool

直接Git克隆下來,然後瀏覽器(最好使用谷歌瀏覽器)開啟idnex.html頁面,即刻輕鬆使用了。

以後都可以使用了,再也不用用什麼熊貓壓縮了。

一鍵壓縮,就是吊!

好用的話,記得加星。

 

 

 

 

 

 

 

 

 

 <style>        *{    padding: 0;    margin: 0;    background-color: #000;    color: #DC143C;    -webkit-touch-callout: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;user-select: none;    }      html,body{    overflow: hidden;    padding: 20px;    box-sizing: border-box;    }    h3{    text-align: center;    }      #compressBox{    display: none;    }    #canvas{    position: fixed;    top: -100000px;    left: -100000px;    opacity: 0;    }    .cont{    margin-top: 20px;    padding: 20px;    box-sizing: border-box;    border: 1px solid #DC143C;    border-radius: 10px;    background-color: #fff;    font-size: 13px;    min-height: 80px;    }    .uploadBtn{position: relative;display: inline-block;padding: 0 20px;line-height: 28px;background-color: #fff;border: 1px solid #DC143C;font-size: 12px;border-radius: 30px;text-align: center;cursor: pointer;width: 300px;    }    .uploadBtn input{    opacity: 0;    position: absolute;    top: 0;    left: 0;    width: 100%;    height: 100%;    cursor: pointer;    }    #selectView{    background-color: #fff;    }    #selectView li{    background-color: #fff;    display: inline-block;    margin-right: 10px;    }    #compressBox{    height: 60px;    background-color: #fff;    }    #active{    position: absolute;left: 50%;transform: translateX(-50%);display: block;padding: 0 20px;line-height: 28px;background-color: #DC143C;border: 1px solid #DC143C;font-size: 12px;border-radius: 30px;text-align: center;cursor: pointer;width: 300px;color: #fff;    }    #show{    display: none;    background-color: #fff;    }    .help{    position: fixed;    font-size: 12px;    bottom: 20px;    left: 0;    text-align: center;    width: 100%;    }    .selectbox{    background-color: #fff;    display: -webkit-flex;    display: -moz-flex;    display: -ms-flex;    display: -o-flex;    display: flex;    }    .selectbox input,.selectbox div,.selectbox select{    background-color: #fff;    }    .selectbox div{    padding-right: 20px;    }    </style>

相關文章