【问题标题】:Filereader image thumbnail lags文件阅读器图像缩略图滞后
【发布时间】:2017-08-31 02:39:14
【问题描述】:

我正在使用 Filereader API 来显示上传照片的小缩略图。但是我遇到了问题。当您上传非常大的图像并且上传其中的一些时,它开始滞后。缩略图非常小,但文件太大。有没有办法来解决这个问题?这是我的javascript:

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 张时它们开始滞后(而我的电脑相当不错,所以它不应该那样滞后)。

顺便说一句,我指的是减速、冻结等,而不是实际的延迟。

我找到了this post,但我真的不知道如何从该答案中实施解决方案。提前谢谢!

【问题讨论】:

    标签: javascript filereader


    【解决方案1】:

    此示例使用 Canvas 将图像的最大宽度调整为 127 像素,然后再将其显示在缩略图列表中。

    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>

    【讨论】:

    • 谢谢,太好了。不过我有几个问题:1)是否可以更改缩放方法(以消除混叠)? 2)我不能使用 ES6,promise 真的有必要吗?我该如何解决它们?
    • 2) 我编辑了我的答案以使用回调而不是承诺。 1)可能,但我对图像处理的了解还不够,无法在这里找到答案。
    • 谢谢,我在这里找到了一种解决方案,所以我将两者融合在一起!
    猜你喜欢
    • 2012-12-04
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2016-12-26
    • 2010-11-13
    • 2012-01-27
    相关资源
    最近更新 更多