by0*_*by0 3 javascript html5 thumbnails filereader
我想作为解释加载本地图片以缩略图的形式在这里.我的代码如下.
这适用于小图像.但是,当您尝试加载较大的图像(例如4mb)时会出现很大的延迟.有没有办法优化这个?
谢谢
<input type="file" id="files" name="files[]" multiple />
<output id="list"></output>
<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>
Mik*_*maa 14
当您在主UI线程中运行某些内容时,总是存在延迟,这涉及操纵巨大blob中的非流数据.滞后不是来自读取数据,而是解码并在浏览器UI中显示图像,因为这涉及在CPU和GPU内存中推动大像素阵列的同步UI操作.这是因为<img>在实际图像数据块(宽度*高度)的块中分配和移动存储器,这对于大图像是非常大的量,并且不必要的详细信息将其推送到GPU以仅在屏幕上显示它(导致滞后几毫秒).
您最有可能通过在读取图像时将图像缩小到可显示的大小来优化您的用例
使用纯Javascript JPEG解码器,其中主事件循环以块的形式读取文件并将块发布到WebWorker后台线程以进行解码.一个示例解码器库https://github.com/notmasteryet/jpgjs/blob/master/jpg.js
分配<canvas>WebWorker逐步回发结果像素的元素.此canvas元素不需要与实际图像大小匹配(见下文)
此外,您可以使用纯Javascript http://www.grantgalitz.org/image_resize/读取WebWorker中的图像,同时减少将像素推送到GPU的需要,因为您不适合将大图像放在首先监视为1:1像素映射
WebWorker和主线程可以使用无副本的Transferable对象推送数据https://developer.mozilla.org/en-US/docs/DOM/Using_web_workers#Passing_data_by_transferring_.C2.A0ownership_%28transferable_objects%29
然而,虽然这里描述的解决方案接近完美,但要实现这一点,需要拥有先进的Javascript技能,并且该解决方案不会与传统兼容(阅读:Microsoft).
| 归档时间: | 
 | 
| 查看次数: | 6584 次 | 
| 最近记录: |