js實現本地的圖片壓縮上傳預覽


js在設計時考慮到安全的原因是不允許讀寫本地文件的,隨着html5的出現提供了fileReader AP從而可以I實現本地圖片的讀取預覽功能,

另外在移動端有的限制圖片大小的需求,主要是考慮圖片過大會占用帶寬,嚴重拖慢瀏覽速度,所以需要進行前端的壓縮,主要通過html5的canvas來實現,

代碼入下:

HTML:

<h3>上傳圖片</h3>
<ul class="list">
    <li class="upload">
        <input type="file" class="chose" accept="image/*" multiple/>
        <img src="img/weituo_luru_add.png" />
    </li>
</ul>

CSS:

* {
    padding: 0;
    margin: 0;
}
h3{
    font-size: 0.6rem;
    font-weight: normal;
    padding: 0.4rem 0.6rem;
}
.list {
    margin-left: 0.4rem;
    margin-top: 0.4rem;
    overflow: hidden;
}
            
.list li {
    float: left;
    width: 2.76rem;
    height: 2.76rem;        
        margin-right: 0.4rem;
    position: relative;
    list-style: none;
}
            
.list img {
    width: 100%;
    height: 100%;
}
            
.upload input {
    width: 100%;
    height: 100% ;
    opacity: 0;
    position: absolute;
    top: 0 ;
    left: 0 ;
    right: 0 ;
    bottom: 0 ;
    z-index: 10;
    transform: translateY(0) ;
}
            
.upload img {
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
}
            
#upcancle {
    position: absolute;
    right: 0;
    width: 0.6rem;
    height: 0.6rem;
    text-align: center;
    line-height: 0.6rem;
    background-color: #00D3AF;
    color: #f3f3f3;
    border: solid 0.02rem #00D3AF;
    font-size: 0.5rem;
    border-radius: 50%;
    z-index: 8;
    font-weight: bold;
}    

JS:

var reader = new FileReader();
    //創建一個img對象
var img = new Image();
    // 選擇的文件對象
var file = null;
     // 縮放圖片需要的canvas
var canvas = document.createElement('canvas');
 var context = canvas.getContext('2d');

     // base64地址圖片加載完畢后
img.onload = function() {
    // 圖片原始尺寸
    var originWidth = this.width;
    var originHeight = this.height;
      // 最大尺寸限制,可通過國設置寬高來實現壓縮程度
    var maxWidth = 800,
       maxHeight = 800;
      // 目標尺寸
   var targetWidth = originWidth,
       targetHeight = originHeight;
      // 圖片尺寸超過400x400的限制
    if(originWidth > maxWidth || originHeight > maxHeight) {
        if(originWidth / originHeight > maxWidth / maxHeight) {
           // 更寬,按照寬度限定尺寸
             targetWidth = maxWidth;
              targetHeight = Math.round(maxWidth * (originHeight / originWidth));
         } else {
             targetHeight = maxHeight;
             targetWidth = Math.round(maxHeight * (originWidth / originHeight));
          }
    }
      // canvas對圖片進行縮放
      canvas.width = targetWidth;
       canvas.height = targetHeight;
      // 清除畫布
      context.clearRect(0, 0, targetWidth, targetHeight);
      //畫布背景色改為白色,默認是黑色,如果上傳的是圓形圖片會背景有黑色塊
     context.fillStyle = '#fff';
      context.fillRect(0, 0, targetWidth, targetHeight);
        // 圖片壓縮                
      context.drawImage(img, 0, 0, targetWidth, targetHeight);

       /*第一個參數是創建的img對象;第二個參數是左上角坐標,后面兩個是畫布區域寬高*/
       //壓縮后的圖片base64 url
        /*canvas.toDataURL(mimeType, qualityArgument),mimeType 默認值是'image/jpeg';
         * qualityArgument表示導出的圖片質量,只要導出為jpg和webp格式的時候此參數才有效果,默認值是0.92*/
      var newUrl = canvas.toDataURL('image/jpeg', 0.92); //base64 格式

        //顯示壓縮后的圖片
       var li = '<li><span id="upcancle">X</span><img src="' + newUrl + '"/></li>';
          $('.list').prepend(li);
};
    //input type='file'上傳時執行的函數
 $('.chose').change(function() {
    file = this.files[0];
     // 選擇的文件是圖片                
    if(this.files && this.files[0]) {
         var ext = this.value.substring(this.value.lastIndexOf(".") + 1).toLowerCase();
         if(ext != 'png' && ext != 'jpg' && ext != 'jpeg') {
              alert("圖片的格式必須為png或者jpg或者jpeg格式!");
              return false;
         } else {
               reader.readAsDataURL(file);
          }
    }
})
 // 文件base64化,以便獲知圖片原始尺寸
reader.onload = function(e) {
       img.src = e.target.result;
};

//刪除按鈕
$('.list').delegate('span', 'click', function() {
      $(this).parents('li').remove();
})

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM