天天看點

FileReader+canvas實作等比例壓縮上傳

前段時間在做移動端的時候,遇到個問題,input 調用手機拍照上傳圖檔的時候,圖檔的尺寸和大小太大了,導緻了上傳太慢,圖檔的尺寸用不是我們想要的,是以我就用FileReader+canvas實作等比例壓縮上傳。FileReader用這個方法擷取上傳圖檔的base64 利用canvas的drawImage和toDataURL對圖檔進行等比例壓縮上傳:代碼如下

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>簡單的html5 File測試 for pic2base64</title>
</head>
<style type="text/css">
    #canvas{
        border: 1px solid #f70707;
    }
</style>
<body>
<input type="file" accept="image/*" capture="camera"  id="demo_input" />
<img src="" id="demoa">

</body>
<script>
window.onload = function(){
    var demo=document.getElementById("demo_input");
    var demoa=document.getElementById("demoa");
    //判斷浏覽器是否支援FileReader
    if(window.FileReader){
        demo.addEventListener("change",chang,false)
    }else{
        alert("浏覽器不支援")
    }
    function chang(){
        var file=this.files[0];
        //利用正規表達式判斷圖檔的格式
        if(!/(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(file.type)){
            alert("上傳的圖檔的格式不對");
            return;
        }
        //擷取上傳圖檔的base64
        var reader=new FileReader(file);
        reader.readAsDataURL(file);
        //利用canvas對圖檔進行等比例縮放和壓縮
        reader.οnlοad=function(){
        var canvas=document.createElement("canvas");
        var ctx=canvas.getContext("2d");
        var image=new Image();
            image.src=this.result;
            image.οnlοad=function(){
                var cw=image.width;
                var ch=image.height;
                var w=image.width;
                var h=image.height;
                canvas.width=w;
                canvas.height=h;
                if(cw>400&&cw>ch){
                    w=400;
                    h=(400*ch)/cw;
                    canvas.width=w;
                    canvas.height=h;
                }
                if(ch>400&&ch>cw){
                    h=400;
                    w=(400*cw)/ch;
                    canvas.width=w;
                    canvas.height=h;

                }
                ctx.drawImage(image,0,0,w,h);
                canvas.toDataURL("image/jpeg",0.7);      
            }
           
        }
    }


}

</script>
</html>
           

希望大牛,勿噴

繼續閱讀