2017-08-30 59 views
1

我使用Filereader API顯示照片上傳的小縮略圖。但是,我遇到了問題。當你上傳真正大的圖片,並且你上傳了一些圖片時,它開始滯後。縮略圖非常小,但文件太大。有沒有辦法來解決這個問題?這是我的javascript:Filereader圖像縮略圖延遲

document.querySelector('input').addEventListener('change', function(e){ 
    var files = e.target.files; 

    for(var i = 0; i < files.length; i++){ 

    var f = files[i]; 
    var reader = new FileReader(); 

    reader.onload = (function(tf){ 
     return function(evt){ 
     document.querySelector('.thumbs').innerHTML += '<div class="thumb" style="background-image: url('+evt.target.result+')"></div>'; 
     } 
    })(f); 

    reader.readAsDataURL(f); 
    } 
}); 

這裏是一個小提琴,你可以測試它:https://jsfiddle.net/snx79yw2/1/。例如,我用6000x4000的照片測試了它,當超過4,5張時,它們開始滯後(而且我的PC非常不錯,所以它不應該像那樣落後)。

順便說一句我指的是減速,凍結等,而不是實際的滯後。

我發現this post但我真的不知道如何從該答案中實現解決方案。 Thx提前!

回答

1

本示例在將圖像顯示在縮略圖列表中之前,使用Canvas將圖像大小調整爲最大寬度127px。

document.querySelector('input').addEventListener('change', function(e){ 
 
    var files = e.target.files; 
 
    for(var i = 0; i < files.length; i++){ 
 
    var f = files[i]; 
 
    var reader = new FileReader(); 
 

 
    reader.onload = (function(tf) { 
 
     return function(evt) { 
 
     // resize the image before using the resolved dataURL to set the thumbnail src 
 
     resize(evt.target.result, 127, function(dataURL) { 
 
      document.querySelector('.thumbs').innerHTML += `<img class="thumb" src="${dataURL}" />`; 
 
     }); 
 
     } 
 
    })(f) 
 

 
    reader.readAsDataURL(f); 
 
    } 
 
}); 
 
/** 
 
* usage resize(dataURL:src, int:maxWidth, function:callback) 
 
*/ 
 
function resize(src, maxWidth, callback) { 
 
    var img = document.createElement('img'); 
 
    img.src = src; 
 
    img.onload =() => { 
 
     var oc = document.createElement('canvas'); 
 
     var ctx = oc.getContext('2d'); 
 
     // resize to [maxWidth] px 
 
     var scale = maxWidth/img.width; 
 
     oc.width = img.width * scale; 
 
     oc.height = img.height * scale; 
 
     ctx.drawImage(img, 0, 0, oc.width, oc.height); 
 
     // convert canvas back to dataurl 
 
     callback(oc.toDataURL()); 
 
    } 
 
}
.thumbs{background: #222;border-radius: 5px;white-space: nowrap;overflow-x: scroll;padding: .25rem;} 
 
.thumb{height: 3rem;width: 3rem;border-radius: 3px;background-size: cover;background-position: center center;background-repeat: no-repeat;display: inline-block;margin: .25rem .25rem calc(.25rem - 4px);}
<input type="file" multiple /> 
 
<div class="thumbs"></div>

+0

謝謝,這是偉大的。我有幾個問題,但:1)是否可以更改縮放方法(以刪除別名)? 2)我不能使用ES6,承諾是否真的是必要的?我如何解決他們? – nick

+0

2)我編輯我的答案使用回調,而不是承諾。 1)可能,但我對圖像處理知之甚少,無法在這裏找到答案。 –

+0

謝謝,我在這裏找到了一個解決方案,所以我要融入這兩個! – nick