javascript - 文件阅读器图像缩略图滞后

标签 javascript filereader

我正在使用 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);
  }
});

这是一个可以测试它的 fiddle :https://jsfiddle.net/snx79yw2/1/ .

例如,我用 6000x4000 的照片对其进行了测试,当超过 4、5 张时,它们开始出现延迟(而且我的 PC 相当不错,所以它不应该那样延迟)。

顺便说一句,延迟是指减速、卡住等,而不是实际延迟。

我找到了 this post但我真的不知道如何根据该答案实现解决方案。提前致谢!

最佳答案

此示例在将图像显示在缩略图列表中之前使用 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>

关于javascript - 文件阅读器图像缩略图滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45966726/

相关文章:

java - 我如何从 Java 8 中的文本文件中读取特定行?

Java每行读取一个文件行

java - 逐行读取文件夹中的所有.txt 文件

javascript - 访问自定义组件数据/方法

javascript - 总是在独立的 tomcat 中返回空的 JSON 数组

javascript - 无法读取未定义 jqgrid 的属性 'errcap'

javascript - 获取错误 "' getAttribute' of undefined "for the last element in the loop

javascript - 在 ng-template 中访问 FormArray 引用

Java:如何读取文本文件的每一行并将每一行设置为数组元素?

javascript - 文件读取器在另一个函数之前解析