通过HTML5文件阅读器在本地以缩略图的形式读取大图像

时间:2012-12-16 21:20:26

标签: javascript html5 thumbnails filereader

我正在尝试按照here解释的缩略图加载本地图像。我的代码如下。

这适用于小图片。但是,当您尝试加载较大的图像(例如4mb)时,存在巨大的滞后。有没有办法优化这个?

由于

HTML

<input type="file" id="files" name="files[]" multiple />
<output id="list"></output>
的Javascript
<script>
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object

// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {

  // Only process image files.
  if (!f.type.match('image.*')) {
    continue;
  }

  var reader = new FileReader();

  // Closure to capture the file information.
  reader.onload = (function(theFile) {
    return function(e) {
      // Render thumbnail.
      var span = document.createElement('span');
      span.innerHTML = ['<img class="thumb" src="', e.target.result,
                        '" title="', escape(theFile.name), '"/>'].join('');
      document.getElementById('list').insertBefore(span, null);
    };
  })(f);

  // Read in the image file as a data URL.
  reader.readAsDataURL(f);
}
}

  document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>

1 个答案:

答案 0 :(得分:13)

当你在主UI线程中运行一些涉及操纵巨大blob中的非流数据时总会有延迟。滞后不是来自读取数据,而是解码并在浏览器UI中显示图像,因为这涉及在CPU和GPU内存中推动大像素阵列的同步UI操作。这是因为<img>在实际图像数据大小(宽度*高度)的块中分配和移动内存,这对于大图像来说是非常大的数量,并且是不必要的详细信息以将其推送到GPU以便仅在屏幕上显示(导致几毫秒的滞后)。

您最有可能通过在阅读时将图像缩小到可显示的大小来优化您的使用案例

然而,虽然这里描述的解决方案接近完美,但要实现此解决方案需要具备高级Javascript技能,并且该解决方案不会与传统兼容(阅读:Microsoft)。

相关问题